Python 2.6.1,osx雪豹上的mysql 5.1。
在我的python代码中连接我正在做; use_unicode = True,charset =“utf8”
mysql告诉我
mysql> SHOW VARIABLES LIKE "character_set%";
+--------------------------+--------------------------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.1.52-osx10.6-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+
8 rows in set (0.00 sec)
所以我们都很好。 我的表结构定义为utf8
CREATE TABLE `urls` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(300) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `url_idx` (`url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我的陈述就像
insert("INSERT INTO urls (url) VALUES (%s)", (url, ))
但是使用unicode字符串我收到错误
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 7: ordinal not in range(128)
我比较清楚......
答案 0 :(得分:2)
问题不在于您的数据库。它甚至没有那么远。你在这里依赖Python的字符串操作:
insert("INSERT INTO urls (url) VALUES (%s)" % (url, ))
永远不要这样做。这很糟糕,因为你不仅试图将一个unicode字符串插入一个ASCII字符串,你也会让自己对SQL注入攻击开放。相反,这样做
(假设您的insert
函数映射到MySQLdb中的某个调用):
insert("INSERT INTO urls (url) VALUES (%s)", (url, ))
不同之处在于您现在正在获取MySQLdb以插入值,从而确保它们将被正确编码和引用。
答案 1 :(得分:0)
对我来说,我会更改mysql的默认设置。如何?
打开my.cnf
并在会话[mysqld]中添加两行,如下所示:
[mysqld]
32 #
33 # * Basic Settings
34 #
35 user = mysql
36 pid-file = /var/run/mysqld/mysqld.pid
37 socket = /var/run/mysqld/mysqld.sock
38 character-set-server = utf8
39 collation-server = utf8_unicode_ci
最后两行(第38和39行)是我添加的内容。 然后,重新启动mysql服务器,并记住重新创建数据库和表。 这样做之后,我认为它应该有效。我试过了它确实有效。