我把它放在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 name
。这会将排序规则设置回默认值。
省略'charset'
选项没有帮助。如果我这样做,它会改为调用set names utf8
,这更糟糕。我尝试将 set name
命令作为我的 'init_command'
的一部分,以防在没有任何可更改的情况下它不会破坏我的排序规则,但不,它仍然会破坏它.
我无法派生 Python 库 MySQLdb
,因为我在 Google App Engine 上运行我的应用程序,而 MySQLdb
是 App Engine 的一部分。
最佳答案
我能够通过猴子修补 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 Connector C。如果没有此字符集,如果您尝试插入任何四字节 UTF8 字符,您的应用程序将会崩溃,并且数据库中的任何现有字符都将显示为问号。
关于mysql - 如何在 Django 中设置 collation_connection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43530477/