Python编码问题(unicode)
在扔西红柿之前,让我解释一下我的问题(我先阅读了python unicode文档) 我使用json模块将json格式的结果解析为字典。这将为我提供unicode编码的字符串(例如:u“My string t\xf4t”)。然后我使用Mysqldb将这个字符串存储在Mysql数据库中。我确定这些数据库是为utf8配置的 然后我检索我的Mysql记录,仍然使用MysqlDB。现在打印的结果看起来像“my string t\xf4t”(不带u)。 由于我需要比较插入的字符串和检索到的字符串,我必须告诉python我的检索字符串是Unicode的 不管我怎么做,我都有一个独角兽的错误。我尝试使用编码:unicode(storedInDB,“utf_8”)和错误参数(“replace”)。但我还是有例外 你有什么提示吗 谢谢你的帮助Python编码问题(unicode),python,unicode,encoding,character-encoding,Python,Unicode,Encoding,Character Encoding,在扔西红柿之前,让我解释一下我的问题(我先阅读了python unicode文档) 我使用json模块将json格式的结果解析为字典。这将为我提供unicode编码的字符串(例如:u“My string t\xf4t”)。然后我使用Mysqldb将这个字符串存储在Mysql数据库中。我确定这些数据库是为utf8配置的 然后我检索我的Mysql记录,仍然使用MysqlDB。现在打印的结果看起来像“my string t\xf4t”(不带u)。 由于我需要比较插入的字符串和检索到的字符串,我必须告诉
u“我的字符串t\xf4t”
是一个Unicode字符串(它的类型是Unicode
),但是“我的字符串t\xf4t”
是一个ByTestString(它的类型是str
)
unicode(storedInDB,“utf_8”)
尝试将bytestring解码为utf-8,但是“我的字符串t\xf4t”
不是有效的utf-8。看起来,尽管您为utf-8配置了MySql,但实际上并没有将utf-8数据写入其中。在发送字符串之前,您必须从Unicode编码到UTF-8。最有可能的是,您要做的是将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/ |
+--------------------------+----------------------------+
解决此问题的一个基本方法是在连接后立即执行设置名称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,因此您不需要直接运行设置名称UTF8
)您是否调用MySQLdb.connect
withuse_unicode=True
?我忘了看这一点(几个月前我在java和jdbc上遇到过同样的问题…)。你解决它!哇,这比我想象的要复杂。在所有地方,默认为UTF-8需要多长时间?