Mysql
 sql >> Database >  >> RDS >> Mysql

Impossibile utilizzare il set di caratteri utf8mb4 con CloudSQL su AppEngine Python

Ho appena chattato con Google e ho fatto funzionare tutto per la nostra istanza!

Il modo standard per far funzionare utf8mb4 in Django è specificarlo come DATABASES['default']['OPTIONS'] in settings.py, in questo modo:

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

Ciò provoca un OperationalError in App Engine, su MySQLdb 1.2.4b4 / 1.2.4 / 1.2.5; il che a quanto pare significa che il client MySQL C su cui google sta compilando manca il set di caratteri utf8mb4.

Rimuovi questa impostazione OPZIONI.

La soluzione alternativa consiste nel chiamare manualmente SET NAMES; modifica lib/django/db/backends/mysql/base.py e aggiungi una riga conn.query("SET NAMES utf8mb4") in DatabaseWrapper.get_new_connection, quindi appare così:

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

Assicurati di avere abilitato anche utf8mb4 sul back-end. I comandi di migrazione nel tutorial di App Engine Django generano un'istanza Cloud SQL configurata per utf8. Avevo bisogno di eseguire questi comandi per abilitare utf8mb4 sulle due tabelle:

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