python - 无法将 character_set_results 设置为 latin1

标签 python mysql django python-3.x django-orm

我决定首次将 Django 1.7 与 Python 3 一起使用。 我需要能够使用包含 utf8 数据的旧 latin1 数据库。我知道这很糟糕,但是数据库太大了,真的不可能改变这一点。所以我尝试了以下方法:

DATABASES = {
    'ENGINE' : 'django.db.backends.mysql', // using MySQL-python fork with support for py3
    ...
    'OPTIONS' : {
        'init_command': "SET character_set_results = 'latin1'",
        #'read_default_file': '/etc/my.cnf.d/client.cnf', // I've also tried this one
    }
}

我还尝试了来自 Oracle 的 python-mysql-connector 并进行了以下设置

DATABASES = {
    'ENGINE' : 'mysql.connector.django', // using MySQL-python fork with support for py3
    'OPTIONS' : {
        'option_files': ['/etc/my.cnf.d/client.cnf'],
    }
}

/etc/my.cnf.d/client.cnf

[client]
init-command='SET character_set_results = "latin1"'
# password, host, username

在这两种情况下,我都可以连接到数据库,但 Django 似乎将 character_set_results 设置回 utf8。

我尝试过以下

from django.db import connection

with connection.cursor() as c:
   // I expect variable to be 'latin1'
   c.execute("show variables like 'character_set_results%'")
   c.fetchone() // returns ('character_set_results', 'utf8')

   // here I try to set it manually
   c.execute("SET character_set_results = 'latin1'")
   c.execute("show variables like 'character_set_results%'")
   c.fetchone() // returns ('character_set_results', 'latin1') // now it's OK
  • 我确定 django 使用 client.cfg 文件和正确的 [section],因为它包含用户名/密码并且成功连接到数据库
  • 当我在使用相同配置文件的 Linux 终端中使用 mysql 命令时,一切都按预期工作

所以我猜 Django 以某种方式强制 character_set_results 变量为 utf8。是否可以?有什么办法可以解决这个问题吗?

非常感谢

最佳答案

我终于弄清楚了(我不知道为什么我总是在将其发布到SO后一段时间才能找到解决方案)

from django.db.backends.signals import connection_created

def connection_setup(**kwargs):
    conn = kwargs['connection']
    with conn.cursor() as cursor:
        cursor.execute("SET character_set_results = 'latin1'")
        cursor.close()

我之前用 Oracle 的 python-mysql-connector 尝试过,但它抛出了

运行时错误:比较中超出了最大递归深度

但它适用于 MySQL-driver py3 分支。我想这可能是 python-mysql-connectorDjango 中的错误,我将报告该错误。也许这会对某人有所帮助。

关于python - 无法将 character_set_results 设置为 latin1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25683570/

相关文章:

django - 导入错误 : No module named 'django.contrib.sitesallauth' in django-allauth

css - Django 模板继承——标记 CSS 类

python - Django 中 Pisa 的 pdf 生成未呈现 CSS

Python,将 float 转换为整数

MySQL - 从 LOCAL INFILE 加载数据 - 如何提高性能

javascript - 从属下拉列表无法正常工作

Django 自动从抽象元类继承 "abstract = true"

python - sys.stdin 读什么?

python - 如何解析以相同字符开头的简约替代方案

Java SQLException : Result Set closed issue