2016-08-07 39 views
7

Ich erhalte ein Fehler versuchen, eine Remote-MySQL-Datenbank von einem Windows 7 Client über Python 2.7 + MySQLdb 1.2.5 + verbinden sqlalchemy 1.0.9. Dies ist ein Ergebnis der vor kurzem Änderung des Standardzeichensatzes des Servers auf utf8mb4. Der Server läuft MySQL 5.5.50.mit Windows-mysql-Python "Can not Zeichensatz utf8mb4 initialisieren"

Ich verbinde wie folgt aus:

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

Der Fehler ist:

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\\)") 

Der Server der my.cnf enthält folgende Komponenten:

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 

Ich habe kein Problem auf die Verbindungs Datenbank von einem Ubuntu-Client, also vermute ich, dass das Problem mit dem Windows-Client und nicht der Serverkonfiguration ist.

Die MySQL-Dokumentation schlägt die Fehlermeldung an den Client zurückzuführen sein könnte werden, ohne Multibyte-Zeichensatz-Unterstützung kompiliert:

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

Da dies jedoch Windows ich einfach den Client und don Download‘ t Kontrolle über seine Kompilierungsflags.

Ich habe versucht, MySQLdb in einer Vielzahl von Möglichkeiten der Installation:

  • Download und Installation der MySQL Connector/Python .msi dev.mysql.com
  • Download und Installation der MySQLdb 1.2.5. exe von pypi
  • Ausführen von Windows „BIB mysql-python installieren“ Eingabeaufforderung

Jede dieser Ergebnisse in einer MySQLdb Bibliothek, die nicht scheinen, kann den utf8mb4 Charakter s zu handhaben et.

Jede Hilfe wäre sehr willkommen!

+0

Welche Version von MySQL beteiligt ist ?? utf8mb4 war bis 5.5.3 nicht verfügbar. –

+0

Tut mir leid, dass ich das nicht einbeziehe - Ich benutze MySQL 5.5.50 – Jugdish

+0

Beachten Sie, dass 'init_connect' nicht ausgeführt wird, wenn Sie als' root' verbinden. –

Antwort

0

Ich bin in Kreisen herumgelaufen, um zu versuchen, dass dies unter Windows funktioniert.

Das einzige, was für mich zu arbeiten scheint, ist dies auszuführen, sobald die Verbindung hergestellt ist:

set names utf8mb4; 
+0

Ausführen wo? – User

+0

Behandle es so, als würdest du einen beliebigen Befehl wählen. (Die Details variieren mit der verwendeten Sprache und API.) –

+0

@RickJames Python/Django. Also habe ich es in den settings.py Optionen eingestellt, wenn das korrekt ist. – User

2

Betrachten Sie die folgende Checkliste:

  1. Haben Sie Ihr MySQL configuration file (/etc/my.cnf) überprüfen?Es sollte sein:

    [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 
    

    Und Sie können sie über überprüfen:

    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) 
    

    -Dank Mathias's blog post

  2. Enfore erzwingen UTF-8 zwischen Python und MySQL verwendet werden:

    # 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 bezüglich Can't initialize character set:

    Dieser Fehler eine der folgenden Ursachen haben:

    • Der Zeichensatz ein Multibyte-Zeichen gesetzt und Sie haben keine Unterstützung für den Zeichensatz im Client. In diesem Fall müssen Sie den Client erneut kompilieren, indem Sie CMake mit der Option -DDEFAULT_CHARSET=charset_name oder -DWITH_EXTRA_CHARSETS=charset_name ausführen. Siehe Abschnitt 2.9.4, “MySQL Source-Configuration Options”.

    • Alle Standard-MySQL-Binärdateien sind kompiliert mit - DWITH_EXTRA_CHARSETS=complex, die Unterstützung für alle Multibyte-Zeichensätze ermöglicht. Siehe Abschnitt 2.9.4, “MySQL Source-Configuration Options”.

    • Der Zeichensatz ist ein einfacher Zeichensatz, der nicht in mysqld kompiliert wird, und die Zeichensatzdefinitionsdateien befinden sich nicht an dem Ort, an dem der Client sie erwartet.

      In diesem Fall müssen Sie eine der folgenden Methoden verwenden, um das Problem zu lösen: für den Zeichensatz

      • Recompile die Kunden-Support. Siehe Abschnitt 2.9.4, “MySQL Source-Configuration Options”.

      • Geben Sie dem Client das Verzeichnis an, in dem sich die Zeichensatzdefinitionsdateien befinden. Für viele Clients können Sie dies mit der Option --character-sets-dir tun.

      • Kopieren Sie die Zeichendefinitionsdateien in den Pfad, in dem der Client sie erwartet.