mysql - 如何在 Django 中设置 collat​​ion_connection?

标签 mysql django collation

我把它放在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 中设置 collat​​ion_connection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43530477/

相关文章:

php - 一个不工作的 mysql 删除查询。为什么?

php - MySQL别名计算

Windows 中的 PHP Mysql 与 Mysqli

php - 更改 while 循环的输出样式

python - Tastypie - 将用户重定向到新的 url

javascript - 如何在单击单选按钮时使按钮处于非事件状态?

python - 如何将 Amazon S3 存储桶中的 URL 存储在 Django sqlite 数据库中以进行显示和评论?

mysql - MySQL 中不区分大小写的 unicode 排序规则

php - php/mysql/phpmyadmin 中的 mysql 排序规则不同

oracle - 在哪里可以查询oracle数据库的大小写敏感度?