2011-07-15 73 views
1

在扔西紅柿之前,讓我解釋一下我的問題(我已經先閱讀了python unicode doc)。Python編碼問題(unicode)

我使用json模塊將json格式的結果解析爲字典。這給了我unicode編碼的字符串(例如:「My string t \ xf4t」)。然後我使用Mysqldb將這個字符串存儲在我的Mysql數據庫中。我確定這些數據庫是爲utf8配置的。

然後我檢索我的Mysql記錄,仍然使用MysqlDB。現在我的打印結果看起來像「我的字符串t \ xf4t」(沒有你)。 因爲我需要比較插入和檢索的字符串,我必須告訴python我的檢索字符串是unicoded。

無論我嘗試什麼,我都有一個UnicodeDecodeError。我試圖玩編碼:unicode(storedInDB,「utf_8」)和錯誤參數(「替換」)。但我仍然有例外。

你有提示嗎?

感謝您的幫助!

+3

你用'use_unicode = True'調用'MySQLdb.connect'嗎? –

+0

我忘了看看這個(幾個月前我和java和jdbc有同樣的問題......)。你解決它! – iwalktheline

回答

1

很可能,您要做的是將charset='utf8'添加到您的MySQLdb.connect()調用中。對於MySQL本身,字符集在許多不同的上下文中分別設置 - 最值得注意的是,對於表存儲和連接(不幸的是,在許多情況下,MySQL似乎仍然默認爲拉丁-1)。所以,你可以 - 例如 - 去設置你的整個數據庫使用UTF-8的麻煩:

CREATE DATABASE somedatabase DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; 

然而,當您連接客戶端,MySQL的仍然可能會認爲你與它溝通其他一些編碼:

mysql> show variables like 'character_set%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

一個基本的解決方案是,以連接後立即執行SET NAMES UTF8,你之前做別的:

mysql> SET NAMES UTF8; 
mysql> show variables like 'character_set%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8      | 
| character_set_connection | utf8      | 
| character_set_database | utf8      | 
| character_set_filesystem | binary      | 
| character_set_results | utf8      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 

然而,在你的情況,這仍然不夠,因爲python MySQLdb模塊本身也希望對你有幫助並自動編碼/解碼python的本地unicode字符串。所以,你必須在MySQLdb中設置字符集。如前所述,這是最好的,在創建MySQLdb連接時傳遞charset='utf8'。 (這也會導致MySQLdb通知MySQL服務器你的連接正在使用UTF8,所以你不需要直接運行SET NAMES UTF8

+0

非常完整:)謝謝 – iwalktheline

+0

哇,這比我想象的更復雜。在任何地方,每個地方都默認使用UTF-8多長時間? –

1

u"My string t\xf4t"是一個Unicode字符串(其類型是unicode),但"My string t\xf4t"是一個字節串(它的類型是str)。

unicode(storedInDB, "utf_8")嘗試將字符串解碼爲UTF-8,但"My string t\xf4t"不是有效的UTF-8。

1

看起來,儘管您爲UTF-8配置了MySql,但您並未真正將UTF-8數據寫入其中。在發送字符串之前,您必須從Unicode編碼爲UTF-8。