Mysql 如何在Django中设置排序规则连接?
我将其放入Mysql 如何在Django中设置排序规则连接?,mysql,django,collation,Mysql,Django,Collation,我将其放入settings.py: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': 'localhost', 'NAME': 'db', 'USER': 'root', 'PASSWORD': '', 'OPTIONS': { 'charset': 'utf8mb4',
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命令之后执行设置名称
。这会将排序规则设置回默认值
省略'charset'
选项没有帮助。如果我这样做,它将调用set names utf8
,这更糟糕。我尝试将集合名称
命令作为我的'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
顺便说一句,这个补丁对于在appengine上使用utf8mb4
字符集是必要的,因为他们使用的是不支持该字符集的MySQL Connector C的旧版本。如果没有此字符集,如果您尝试插入任何四字节UTF8字符,您的应用程序将崩溃,数据库中的任何现有字符将显示为问号。'default':{
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '',
'USER': '',
'PASSWORD': '',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'init_command': 'ALTER DATABASE <YOUR_DB_NAME> CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci',
},
}
'ENGINE':'django.db.backends.mysql',
“姓名”:“,
“用户”:“,
“密码”:“,
'主机':'本地主机',
“端口”:“3306”,
“选项”:{
“init_命令”:“更改数据库字符集utf8mb4 COLLATE utf8mb4_常规_ci”,
},
}
噢,“第三方软件妨碍”的清单越来越多了!请提供一种情况,即排序规则\u连接
的错误值会给您带来麻烦。排序规则\u连接
仅在不涉及数据库列的操作中起作用。然而,令人恼火的是,这里会有不一致的地方。如果可能的话,我喜欢删除奇怪的边缘案例。排序规则会影响很多事情,例如任何字符串比较的行为,包括相等(=)和排序顺序。