0

MySQLdb我在我的gentoo中写了一个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

4

1 回答 1

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 时设置的,并且可以受configureoption 的影响,如果未指定--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文档中有更多信息,可能还值得一看MySQL 文档的第 10.1 节。

于 2013-05-24T14:08:38.197 回答