2011-01-25 115 views
0

我在阿拉伯數據頁表中有一列。奇怪的MySQL編碼問題

如果我這樣做...

@mysql_query("select title from pages where web_id = '$id'"); 

我得到正確的數據,在阿拉伯語。

但是,如果我再次調用相同的函數,實際上,它是在一個循環中,第二次它帶給我垃圾數據。看起來像這樣

"تنظيم الأوقا٠العامة اقرأ قطاع 

而且,如果該查詢之前,我做任何這樣:

@mysql_query("SET NAMES 'utf8'"); 
@mysql_set_charset('utf8'); 
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'"); 

我總是得到垃圾數據,甚至在第一個電話。這裏發生了什麼事?

注意,數據庫,表和字段排序規則設置爲utf8_bin

回答

1

一些隨機提示:

儘量不要使用@操作。它會抑制任何錯誤消息。

您需要正確逃生輸入參數:

mysql_query("SELECT title FROM pages WHERE web_id = '" . mysql_real_escape_string($id) . "'"); 

您需要檢查的mysql_query()返回值:

$res = mysql_query("SELECT title FROM pages WHERE web_id = '" . mysql_real_escape_string($id) . "'"); 
if(!$res){ 
    die('Could not fetch page title'); // See mysql_error() for error message 
} 

確保你的PHP源代碼保存爲UTF-8。任何體面的編輯器都可以保存爲UTF-8,並在狀態欄中顯示當前編碼。

檢查您的表格定義。 MySQL允許設置每個表和列的編碼。

使用mysql_set_charset()設置連接編碼。

確保瀏覽器將您的頁面呈現爲UTF-8。在PHP中,您可以生成相應的HTTP標頭:

header('Content-Type: text/html; charset=utf-8'); 
+0

id已被轉義。有一個返回值。 php代碼被保存爲utf-8。頁面以utf-8編碼顯示。正如我已經提到的,我試過mysql_set_charset() – HyderA 2011-01-25 10:23:01

0

您應該確認你的領域是否真的包含UTF-8的數據。即使它設置爲UTF-8,也可能導入了錯誤的數據或數據可能已損壞。你可以看一下具體的字節流使用:

SELECT hex(myfield) FROM mytable; 

如果您已導入數據,你應該注意的是,數據文件可能被解釋爲不同的編碼是 - 事實上它甚至可能已經做到。你需要確保文件被正確識別,例如:

mysql --default-character-set=utf8 database < mydbbackup.sql