Python - 插入unicode的mysqldb失败

时间:2010-11-19 09:14:28

标签: python mysql unicode

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)

我比较清楚......

2 个答案:

答案 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服务器,并记住重新创建数据库和表。 这样做之后,我认为它应该有效。我试过了它确实有效。