«Невозможно инициализировать набор символов utf8mb4» с помощью mysql-python Windows

Я получаю сообщение об ошибке, пытаюсь подключиться к удаленной базе данных 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 различными способами:

  • Загрузка и установка MySQL Connector / Python .msi с сайта dev.mysql.com
  • Загрузка и установка MySQLdb 1.2.5 .exe из pypi
  • Запуск «pip install mysql-python» из командной строки Windows

Каждый из этих результатов представляет собой библиотеку MySQLdb, которая не может обрабатывать набор символов utf8mb4.

Любая помощь приветствуется!

2 Solutions collect form web for “«Невозможно инициализировать набор символов utf8mb4» с помощью mysql-python Windows”

Рассмотрим следующий контрольный список:

  1. Вы проверили свой конфигурационный файл MySQL (/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

  2. Предварительно используйте UTF-8 для использования между Python и MySQL:

     # 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() 
    • благодаря ответу Томаша Нгуена на stackoverflow
  3. Официальный совет от MySQL относительно Can't initialize character set :

    Эта ошибка может иметь одну из следующих причин:

    • Набор символов – многобайтовый набор символов, и у вас нет поддержки набора символов в клиенте. В этом случае вам нужно перекомпилировать клиент, запустив CMake с параметром -DDEFAULT_CHARSET=charset_name или -DWITH_EXTRA_CHARSETS=charset_name . См. Раздел 2.9.4 «Параметры конфигурации источника MySQL» .

    • Все стандартные двоичные файлы MySQL скомпилированы с помощью – DWITH_EXTRA_CHARSETS=complex , что позволяет поддерживать все многобайтовые наборы символов. См. Раздел 2.9.4 «Параметры конфигурации источника MySQL» .

    • Набор символов – это простой набор символов, который не скомпилирован в mysqld, а файлы определения набора символов не находятся там, где клиент ожидает их поиска.

      В этом случае для решения проблемы необходимо использовать один из следующих способов:

      • Перекомпилируйте клиент с поддержкой набора символов. См. Раздел 2.9.4 «Параметры конфигурации источника MySQL» .

      • Укажите клиенту каталог, в котором находятся файлы определения набора символов. Для многих клиентов вы можете сделать это с помощью --character-sets-dir .

      • Скопируйте файлы определения символов в путь, на который клиент ожидает их.

Я крутился вокруг, пытаясь заставить это работать в Windows.

Единственное, что, кажется, работает для меня, – это выполнить это после установления соединения:

 set names utf8mb4; 
Interesting Posts
Python - лучший язык программирования в мире.