我把这个放到了settings.py里
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'NAME': 'db',
'USER': 'root',
'PASSWORD': '',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': 'set collation_connection=utf8mb4_unicode_ci',
},
},
}然后我使用shell来检查它是否正常工作:
$ ./manage.py shell
>>> from django.db import connection
>>> cursor = connection.cursor()
>>> cursor.execute("show variables like 'collation_connection'")
>>> print cursor.fetchall()
((u'collation_connection', u'utf8mb4_general_ci'),)不幸的是,我从检查我的查询日志中了解到,MySQLdb在连接时会这样做:
set collation_connection='utf8mb4_unicode_ci'
SET NAMES utf8mb4没错。它在我的init命令之后执行set names。这会将排序规则设置回默认设置。
省略'charset'选项无济于事。如果我这样做了,它将调用set names utf8,这会更糟。我尝试使set names命令成为我的'init_command'的一部分,以防它不会破坏我的排序规则(如果没有什么需要更改的话),但是没有,它仍然破坏它。
我不能派生Python库MySQLdb,因为我在Google app Engine上运行我的应用程序,而MySQLdb是App Engine的一部分。
发布于 2017-04-29 08:41:42
我能够做到这一点,通过猴子修补Django:
from django.db.backends.mysql import base
old_get_new_connection = base.DatabaseWrapper.get_new_connection
def get_new_connection(self, conn_params):
conn = old_get_new_connection(self, conn_params)
conn.query("set names 'utf8mb4' collate 'utf8mb4_unicode_520_ci'")
return conn
base.DatabaseWrapper.get_new_connection = get_new_connection顺便说一句,即使在App Engine上使用utf8mb4字符集,这个补丁也是必要的,因为他们使用的是不支持该字符集的MySQL连接器C的旧版本。如果没有这个字符集,如果您尝试插入任何四个字节的UTF8字符,您的应用程序将崩溃,并且数据库中现有的任何字符都将显示为问号。
https://stackoverflow.com/questions/43530477
复制相似问题