Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Der utf8mb4-Zeichensatz kann mit CloudSQL auf AppEngine Python nicht verwendet werden

Ich habe gerade mit Google gechattet und alles für unsere Instanz zum Laufen gebracht!

Die Standardmethode, um utf8mb4 in Django zum Laufen zu bringen, besteht darin, es als DATABASES['default']['OPTIONS'] in settings.py anzugeben, wie folgt:

'OPTIONS': {'charset': 'utf8mb4'},

Dies verursacht einen OperationalError in App Engine, auf MySQLdb 1.2.4b4 / 1.2.4 / 1.2.5; was anscheinend bedeutet, dass dem MySQL C-Client, gegen den Google kompiliert, der utf8mb4-Zeichensatz fehlt.

Entfernen Sie diese OPTIONS-Einstellung.

Die Problemumgehung besteht darin, SET NAMES manuell aufzurufen; Bearbeiten Sie lib/django/db/backends/mysql/base.py und fügen Sie eine conn.query("SET NAMES utf8mb4")-Zeile in DatabaseWrapper.get_new_connection ein, sodass es so aussieht:

def get_new_connection(self, conn_params):
    conn = Database.connect(**conn_params)
    conn.encoders[SafeText] = conn.encoders[six.text_type]
    conn.encoders[SafeBytes] = conn.encoders[bytes]
    conn.query("SET NAMES utf8mb4")
    return conn

Stellen Sie sicher, dass Sie auch utf8mb4 im Backend aktiviert haben. Die Migrationsbefehle im App Engine-Django-Tutorial führen zu einer Cloud SQL-Instanz, die für utf8 konfiguriert ist. Ich musste diese Befehle ausführen, um utf8mb4 für die beiden Tabellen zu aktivieren:

ALTER TABLE polls_question CONVERT TO CHARACTER SET utf8mb4;
ALTER TABLE polls_choice CONVERT TO CHARACTER SET utf8mb4;