在扔番茄之前,让我解释一下我的问题(我先读过python unicode doc)。
我使用json模块将json格式的结果解析为字典。这给了我unicode编码的字符串(例如:u“My string t \ xf4t”)。然后我用Mysqldb将这个字符串存储在我的Mysql数据库中。我确切地说这些数据库是为utf8配置的。
然后我检索我的Mysql记录,仍然使用MysqlDB。现在打印的结果看起来像“我的字符串t \ xf4t”(没有你)。 因为我需要比较插入和检索的字符串,我必须告诉python我的检索字符串是unicoded。
无论我尝试什么,我都有一个UnicodeDecodeError。我尝试使用编码:unicode(storedInDB,“utf_8”)和错误参数(“替换”)。但我仍然有例外。
你有提示吗?
感谢您的帮助!
答案 0 :(得分: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 :(得分:1)
虽然您为UTF-8配置了MySql,但实际上并没有将UTF-8数据写入其中。在发送字符串之前,您必须从Unicode编码为UTF-8。
答案 2 :(得分:1)
您最有可能的做法是将charset='utf8'
添加到MySQLdb.connect()
来电。
对于MySQL本身,字符集在许多不同的上下文中单独设置 - 最值得注意的是,对于表存储和连接(并且遗憾的是,在许多情况下,MySQL似乎仍然默认为latin-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
)