很可能,您要做的是将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
)
你用'use_unicode = True'调用'MySQLdb.connect'吗? –
我忘了看看这个(几个月前我和java和jdbc有同样的问题......)。你解决它! – iwalktheline