【发布时间】:2017-09-17 17:37:21
【问题描述】:
我把这个放在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 的一部分。
【问题讨论】:
-
哦,“第 3 方软件阻碍”的列表越来越多!
-
请提供
collation_connection的错误值给您带来麻烦的情况。 -
collation_connection仅在不涉及数据库列的操作中很重要。但是,令人讨厌的是那里会出现不一致。如果可能的话,我喜欢删除奇怪的边缘情况。排序规则会影响很多方面,例如任何字符串比较的行为,包括相等 (=) 和排序顺序。