2016-03-22 90 views
6

我已经设置了一个CloudSQL实例,我尝试在AppEngine上使用我的Django应用程序。我已经证实,服务器设置为使用utf8mb4字符通过CLOUDSQL控制台设置为我的数据库:无法在AppEngine上使用CloudSQL的utf8mb4字符集Python

utf8mb4 utf8mb4_unicode_ci 

如果我直接用mysql的CLI连接,我可以成功地插入和读取的表情符号。但是,如果我通过Django管理员插入相同的表情符号,它只是插入为“????”。

我试图确保MySQLdb的-python的客户端使用utf8mb4有:

'ENGINE': 'django.db.backends.mysql', 
... 
'OPTIONS': { 
    'charset': "utf8mb4", 
} 

但是,这使我获得AppEngine上出现以下错误:

(2019, "Can't initialize character set utf8mb4 (path: /usr/local/mysql/share/charsets/)") 

我的app.yaml是使用“最新”的MySQLdb库:

libraries: 
- name: MySQLdb 
    version: "latest" 
+0

同样确切的问题,请如果您发现解决方案,请在此处填写。谢谢。 –

+0

你有没有找到这个解决方案?我试过MySQLdb(1.2.5)远程连接,它工作正常,它让我相信GAE上的libmysqlclient太旧了,是真正的问题。我即将放弃。 – jturmel

回答

1

我刚刚与谷歌聊天,得到everythi ng为我们的实例工作!

标准的方式来获得utf8mb4在Django的工作是将其指定为资料库[“默认”]在settings.py [“选项”],就像这样:

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

这将导致应用程序的OperationalError引擎,在MySQLdb 1.2.4b4/1.2.4/1.2.5上;这显然意味着谷歌正在编译的MySQL C客户端缺少utf8mb4字符集。

删除此选项设置。

解决方法是手动调用SET NAMES;编辑LIB/Django的/ DB /后端/ mysql /下base.py并添加conn.query( “集名utf8mb4”)行成DatabaseWrapper.get_new_connection,所以它看起来是这样的:

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 

确保您在后端也启用了utf8mb4。 App Engine Django教程中的迁移命令会为utf8配置一个Cloud SQL实例。我需要运行这些命令来在两个表上启用utf8mb4:

ALTER TABLE polls_question CONVERT TO CHARACTER SET utf8mb4; 
ALTER TABLE polls_choice CONVERT TO CHARACTER SET utf8mb4; 
相关问题