Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Não é possível usar o conjunto de caracteres utf8mb4 com CloudSQL no AppEngine Python


Acabei de conversar com o google e fiz tudo funcionar para nossa instância!

A maneira padrão de fazer o utf8mb4 funcionar no Django é especificá-lo como DATABASES['default']['OPTIONS'] em settings.py, assim:
'OPTIONS': {'charset': 'utf8mb4'},

Isso causa um OperationalError no App Engine, no MySQLdb 1.2.4b4 / 1.2.4 / 1.2.5; o que aparentemente significa que o cliente MySQL C que o google está compilando não possui o conjunto de caracteres utf8mb4.

Remova esta configuração de OPÇÕES.

A solução é chamar manualmente SET NAMES; edite lib/django/db/backends/mysql/base.py e adicione uma linha conn.query("SET NAMES utf8mb4") em DatabaseWrapper.get_new_connection, para que fique assim:
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

Certifique-se de que você também tenha o utf8mb4 ativado no back-end. Os comandos de migração no tutorial do App Engine Django resultam em uma instância do Cloud SQL configurada para utf8. Eu precisava executar esses comandos para habilitar o utf8mb4 nas duas tabelas:
ALTER TABLE polls_question CONVERT TO CHARACTER SET utf8mb4;
ALTER TABLE polls_choice CONVERT TO CHARACTER SET utf8mb4;