【问题标题】:"Can't initialize character set utf8mb4" with Windows mysql-python使用 Windows mysql-python “无法初始化字符集 utf8mb4”
【发布时间】:2016-12-13 07:30:22
【问题描述】:

尝试从一个远程 mysql 数据库连接到一个错误 Windows 7 客户端通过 python 2.7 + MySQLdb 1.2.5 + sqlalchemy 1.0.9。这是最近将服务器的默认字符集更改为 utf8mb4 的结果。服务器正在运行 MySQL 5.5.50

我是这样连接的:

DB_ENGINE = sqlalchemy.create_engine("mysql+mysqldb://{user}:{pass}@{host}:{port}/{database}?charset=utf8mb4".format(**DB_SETTINGS))
Session = sqlalchemy.orm.sessionmaker(bind=DB_ENGINE)

错误是:

  File "C:\Applications\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 385, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "C:\Applications\Python27\lib\site-packages\MySQLdb\__init__.py", line 81, in Connect
    return Connection(*args, **kwargs)
  File "C:\Applications\Python27\lib\site-packages\MySQLdb\connections.py", line 221, in __init__
    self.set_character_set(charset)
  File "C:\Applications\Python27\lib\site-packages\MySQLdb\connections.py", line 312, in set_character_set
    super(Connection, self).set_character_set(charset)
sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2019, "Can't initialize character set utf8mb4 (path: C:\\mysql\\\\share\\charsets\\)")

服务器的 my.cnf 包含以下内容:

init_connect                   = 'SET collation_connection = utf8mb4_unicode_ci'
init_connect                   = 'SET NAMES utf8mb4'
character-set-server           = utf8mb4
collation-server               = utf8mb4_unicode_ci
skip-character-set-client-handshake

我从 Ubuntu 客户端连接到数据库没有问题,所以我怀疑问题出在 Windows 客户端而不是服务器的配置上。

MySQL 文档表明错误消息可能是由于客户端在不支持多字节字符集的情况下进行编译:

http://dev.mysql.com/doc/refman/5.7/en/cannot-initialize-character-set.html

但是,由于这是 Windows,我只是下载客户端,无法控制其编译标志。

我尝试过多种方式安装 MySQLdb:

  • 从 dev.mysql.com 下载并安装 MySQL 连接器/Python .msi
  • 从 pypi 下载并安装 MySQLdb 1.2.5 .exe
  • 从 Windows 命令提示符运行“pip install mysql-python”

这些中的每一个都会导致一个似乎无法处理 utf8mb4 字符集的 MySQLdb 库。

任何帮助将不胜感激!

【问题讨论】:

  • 涉及什么版本的MySQL?? utf8mb4 直到 5.5.3 才可用。
  • 抱歉没有包括在内——我正在运行 MySQL 5.5.50
  • 请记住,当您以root 连接时,init_connect 不会被执行。
  • 我正在使用带有 utf8 编码的数据库,并且所有必需的标准 unicode 微笑都可以。你用 utf8 测试过吗?

标签: python mysql windows mysql-python utf8mb4


【解决方案1】:

我绕着圈子试图让它在 Windows 上运行。

似乎对我有用的唯一方法是在建立连接后执行此操作:

set names utf8mb4;

【讨论】:

  • 在哪里执行?
  • 像对待任何非选择命令一样对待它。 (详细信息因使用的语言和 API 而异。)
  • @RickJames Python/Django。所以我在 settings.py 选项中设置它,如果正确的话。
  • 请显示settings.py(或至少显示相关部分)。
  • @RickJames 'OPTIONS': {'charset': 'utf8mb4'}, 在 settings.py 中
【解决方案2】:

考虑以下清单:

  1. 你检查你的MySQL configuration file (/etc/my.cnf)了吗?应该是:

    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    

    您可以通过以下方式验证它们:

    mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
    +--------------------------+--------------------+
    | Variable_name            | Value              |
    +--------------------------+--------------------+
    | character_set_client     | utf8mb4            |
    | character_set_connection | utf8mb4            |
    | character_set_database   | utf8mb4            |
    | character_set_filesystem | binary             |
    | character_set_results    | utf8mb4            |
    | character_set_server     | utf8mb4            |
    | character_set_system     | utf8               |
    | collation_connection     | utf8mb4_unicode_ci |
    | collation_database       | utf8mb4_unicode_ci |
    | collation_server         | utf8mb4_unicode_ci |
    +--------------------------+--------------------+
    10 rows in set (0.00 sec)
    

    -感谢Mathias's blog post

  2. Enfore 强制在 Python 和 MySQL 之间使用 UTF-8:

    # Connect to mysql.
    dbc = MySQLdb.connect(host='###', user='###', passwd='###', db='###', use_unicode=True)
    
    # Create a cursor.
    cursor = dbc.cursor()
    
    # Enforce UTF-8 for the connection.
    cursor.execute('SET NAMES utf8mb4')
    cursor.execute("SET CHARACTER SET utf8mb4")
    cursor.execute("SET character_set_connection=utf8mb4")
    
    # Do database stuff.
    
    # Commit data.
    dbc.commit()
    
    # Close cursor and connection.
    cursor.close()
    dbc.close()
    
  3. Official tip from MySQL 关于Can't initialize character set:

    此错误可能有以下任何原因:

    • 字符集是多字节字符集,客户端不支持该字符集。在这种情况下,您需要通过使用-DDEFAULT_CHARSET=charset_name-DWITH_EXTRA_CHARSETS=charset_name 选项运行CMake 来重新编译客户端。请参阅第 2.9.4 节,“MySQL Source-Configuration Options”

    • 所有标准 MySQL 二进制文件都使用 -DWITH_EXTRA_CHARSETS=complex 编译,这支持所有多字节字符集。请参阅第 2.9.4 节,“MySQL Source-Configuration Options”

    • 字符集是简单的字符集,没有编译成mysqld,字符集定义文件不在客户端期望找到的地方。

      在这种情况下,您需要使用以下方法之一来解决问题:

      • 重新编译支持字符集的客户端。请参阅第 2.9.4 节,“MySQL Source-Configuration Options”

      • 向客户端指定字符集定义文件所在的目录。对于许多客户,您可以使用--character-sets-dir 选项来执行此操作。

      • 将字符定义文件复制到客户端期望的路径。

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 2016-02-23
    • 2019-12-12
    • 2017-09-07
    • 1970-01-01
    • 2023-03-18
    • 2020-04-21
    • 1970-01-01
    • 2012-04-27
    相关资源
    最近更新 更多