2010-12-16 60 views
14

好的,我目前在PHP/MySQL/UTF-8/Unicode地獄!UTF8問題PHP - > MySQL。在數據庫中獲取問號?

我的環境: MySQL的:53年5月1日 服務器字符集:latin1的 Db的字符集:latin1的 客戶端字符集:latin1的 康涅狄格州字符集:latin1的

PHP:5.3.3

我的PHP文件被保存爲UTF-8格式,而不是ASCII文件。

在我的PHP代碼時,我做的數據庫連接我做到以下幾點:我的MySQL數據庫的

ini_set('default_charset', 'utf-8'); 
$my_db = mysql_connect(DEV_DB, DEV_USER, DEV_PASS); 
mysql_select_db(MY_DB); 
// I have tried both of the following utf8 connection functions 
// mysql_query("SET NAMES 'utf8'", $my_db); 
mysql_set_charset('utf8', $my_db); 
// Detect if form value is not UTF-8 
if (mb_detect_encoding($_POST['lang_desc']) == 'UTF-8') { 
$lang_description = $_POST['lang_desc']; 
} else { 
$lang_description = utf8_encode($_POST['lang_desc']); 
} 
$language_sql = sprintf(
'INSERT INTO app_languages (language_id, app_id, description) VALUES (%d, %d, "%s")', 
          intval($lang_data['lang_id']), 
          intval($new_app_id), 
          mysql_real_escape_string($lang_description, $my_db) 
); 

格式/創建是:

CREATE TABLE IF NOT EXISTS app_languageslanguage_id int(10)unsigned NOT NULL, app_id int(10)unsigned NOT NULL, description tinytext collat​​e utf8_unicode_ci, PRIMARY KEY(language_id,app_id) )ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

是從我的PHP代碼生成的SQL語句如下所示:

INSERT INTO app_languages (language_id, app_id, description) VALUES (91, 2055, "阿拉伯體育新聞和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (26, 2055, "阿拉伯體育新聞和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (56, 2055, "בערבית ספורט חדשות ומידע") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (69, 2055, "アラビア語のスポーツニュースと情報") 

然而,輸出的圖像顯示在我的數據庫,因爲這:

|   69 | 2055 | ?????????????????        | 
|   56 | 2055 | ?????? ????? ????? ?????      | 
|   28 | 2055 | Arapski sportske vijesti i informacije   | 
|   42 | 2055 | Arabe des nouvelles sportives et d\'information | 
|   91 | 2055 | ??????????          | 

我在做什麼錯??

P.S.我們可以使用Putty直接SSH到數據庫服務器並通過命令行粘貼一個unicode /多語言插入語句。他們成功地工作!?

非常感謝您提供的任何燈光,這讓我發瘋。

乾杯,傑森

回答

1

答案在你的問題是正確的。您在整個數據庫中使用latin1,並且它無法處理unicode。您還需要將它們更改爲UTF-8。

+0

不,這不是正確的,因爲你會在我的意見看「PS我們可以用膩子直接SSH連接到數據庫服務器,並通過命令行粘貼的Unicode /多語種插入語句之一。他們成功地工作!?」 – Jason 2010-12-16 12:08:12

+0

@Jason你確定膩子使用正確的編碼嗎? http://thegreyblog.blogspot.com/2009/08/configuring-putty-to-use-utf-8.html – bobo 2010-12-16 12:27:18

+0

@bobo,沒錯這就是膩子究竟是如何處理的編碼,這是UTF-8。 – Jason 2010-12-16 12:35:00

13

嘗試您選擇的數據庫後執行以下查詢:

SET NAMES 'utf8' 

此查詢應該在你的文件和數據庫字符集不同的解決問題。

菲利克斯

+1

非常感謝。你的回答解決了我的嚴重問題。 – 2015-01-21 21:24:50

+0

很好的答案。我有同樣的問題,所以它解決了我的問題。非常感謝 – ako 2016-07-22 10:40:29

0
//first make sure your file produce utf-8 chars 
header('Content-Type: text/html; charset=utf-8'); 
0

mb_detect_encoding是相當無用的,除非你已經知道你正在處理。除非指定第二個和第三個參數,否則您可能不應該依賴它。目前它可能不會返回您認爲它的作用。

0

我看到你看到它的文字是???????是阿拉伯文字..其中必須有一個整理

cp1256_general_ci 

UTF-8_general_ci 

變化是,它可能會解決問題。