【问题标题】:Why do I get different charset when python use MySQLdb?python 使用 MySQLdb 时为什么会得到不同的字符集?
【发布时间】:2013-05-19 00:30:39
【问题描述】:

我在我的 gentoo 中写了一个使用 MySQLdb 的 python 程序:

  • mysql版本=5.1.67-log Gentoo Linux mysql-5.1.67
  • 字符集 = utf-8

当我连接到 mysql 和 print conn.character_set_name() 时,它返回 utf-8

但是当我在我的 VPS(ubuntu) 中测试程序时

  • mysql版本=5.1.60-log Source distribution
  • 字符集 = utf-8.

在我的程序中我 print conn.character_set_name() 它返回 latin1?

为什么两台机器使用 MySQLdb 字符集不一样?


我已经阅读了MySQLdb 的源代码,它使用了_mysql 模块,但这是一个.so 文件。我不知道如何获得charser

【问题讨论】:

  • 它可能会从/etc/my.cnf 中的mysql 配置中获取一个默认字符集(或者它存在于您系统上的任何位置)。该值也有可能被硬编码到mysqld 二进制文件中——我隐约记得我上次编译mysql 时有一个configure 参数来设置它。当你连接到 mysql 时覆盖字符集可能是最安全的,那么默认值是什么都没关系。
  • @Aya ,我在命令中连接mysql并使用status,它说所有字符集都是utf-8。而且我只看到/etc/my.cnf,没有关于charset的选项。
  • @Aya ,我已经检查了本地机器中的 my.conf 。还有字符集,可能是我的vps里的mysql,charset是硬编码在mysqld里的
  • 添加了更多信息的答案。为了获得最大的可移植性,最好始终指定要使用的字符集,然后默认值就无关紧要了。

标签: python mysql python-2.7 encode


【解决方案1】:

首先值得注意的是,在mysql上可以设置几个不同的字符集参数...

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

...可以在my.cnf中配置,但一般只需要考虑其中的两个...

  1. 在磁盘上存储数据时使用的字符集。
  2. 客户端/服务器协议中使用的字符集。

第一个是在编译mysql时初始设置的,可以受configure option--with-charset的影响,如果未指定,默认为latin1

您可以在创建数据库时基于每个数据库覆盖默认值...

CREATE DATABASE my_database CHARACTER SET 'utf8';

...或者在使用...创建表时基于每个字段

CREATE TABLE my_table
(
    ...
    my_field VARCHAR(255) CHARACTER SET 'utf8',
    ...
);

至于第二个,我不确定默认值来自哪里,但您可以在每个连接的基础上使用...覆盖它

SET NAMES 'utf8';

...或者如果您使用的是MySQLdb,最好在connect() 设置中指定它...

conn = MySQLdb.connect(host='my_host',
                       ...
                       charset='utf8')

MySQLdb documentation 中有更多信息,可能还值得一看 MySQL 文档的 section 10.1

【讨论】:

  • 是的,我检查了mysql cmd中的字符集,都是utf-8,我检查了my.cnf,但是没有关于字符集的配置,我使用LNMP一键安装。也许正如您所说,它是其中的硬编码。我认为连接时指向字符集是一个好习惯。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-14
  • 2015-04-06
  • 2020-02-11
  • 2011-08-11
  • 2015-06-20
相关资源
最近更新 更多