2011-07-15 74 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。