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连接
仅在不涉及数据库列的操作中起作用。然而,令人恼火的是,这里会有不一致的地方。如果可能的话,我喜欢删除奇怪的边缘案例。排序规则会影响很多事情,例如任何字符串比较的行为,包括相等(=)和排序顺序。