首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django中设置collation_connection?

如何在Django中设置collation_connection?
EN

Stack Overflow用户
提问于 2017-04-21 05:46:29
回答 1查看 1.4K关注 0票数 2

我把这个放到了settings.py

代码语言:javascript
复制
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来检查它是否正常工作:

代码语言:javascript
复制
$ ./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在连接时会这样做:

代码语言:javascript
复制
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的一部分。

EN

回答 1

Stack Overflow用户

发布于 2017-04-29 08:41:42

我能够做到这一点,通过猴子修补Django:

代码语言:javascript
复制
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连接器C的旧版本。如果没有这个字符集,如果您尝试插入任何四个字节的UTF8字符,您的应用程序将崩溃,并且数据库中现有的任何字符都将显示为问号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43530477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档