Mysql
 sql >> Base de données >  >> RDS >> Mysql

Impossible d'utiliser le jeu de caractères utf8mb4 avec CloudSQL sur AppEngine Python

Je viens de discuter avec Google et tout fonctionne pour notre instance !

La méthode standard pour faire fonctionner utf8mb4 dans Django consiste à le spécifier en tant que DATABASES['default']['OPTIONS'] dans settings.py, comme ceci :

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

Cela provoque une erreur opérationnelle dans App Engine, sur MySQLdb 1.2.4b4 / 1.2.4 / 1.2.5 ; ce qui signifie apparemment que le client MySQL C avec lequel google compile manque le jeu de caractères utf8mb4.

Supprimez ce paramètre OPTIONS.

La solution consiste à appeler manuellement SET NAMES ; éditez lib/django/db/backends/mysql/base.py et ajoutez une ligne conn.query("SET NAMES utf8mb4") dans DatabaseWrapper.get_new_connection, donc cela ressemble à ceci :

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

Assurez-vous que vous avez également activé utf8mb4 sur le backend. Les commandes de migration du didacticiel App Engine Django génèrent une instance Cloud SQL configurée pour utf8. J'avais besoin d'exécuter ces commandes pour activer utf8mb4 sur les deux tables :

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