【问题标题】:Python - mysqldb inserting unicode failsPython - mysqldb插入unicode失败
【发布时间】:2023-03-26 10:49:01
【问题描述】:

在 osx 雪豹上运行 Python 2.6.1、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)

我不知道...

【问题讨论】:

  • url 列排序规则是什么?

标签: python mysql unicode


【解决方案1】:

问题不在于您的数据库。它甚至没有那么远。您在这里依赖 Python 的字符串操作:

insert("INSERT INTO urls (url) VALUES (%s)" % (url, ))

永远不要这样做。这很糟糕,因为您不仅要尝试将 unicode 字符串插入 ASCII 字符串,而且还会让自己受到 SQL 注入攻击。相反,这样做 (假设您的 insert 函数映射到 MySQLdb 中的某个调用):

insert("INSERT INTO urls (url) VALUES (%s)", (url, ))

不同之处在于您现在让 MySQLdb 插入值,从而确保它们被正确编码和引用。

【讨论】:

  • 对不起,我的错误,我在问题中的代码是错误的。正如你所展示的,我确实使用了正确的技术,我在我的程序中将它分成两行。再次抱歉。所以,这是另一回事。
  • 在这种情况下,请显示实际代码和完整的回溯。
【解决方案2】:

对我来说,我会更改 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 服务器,并记住重新创建数据库和表。 这样做之后,我认为它应该可以工作。我已经尝试过了,它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 2016-08-22
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多