首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将character_set_results设置为latin1

无法将character_set_results设置为latin1
EN

Stack Overflow用户
提问于 2014-09-05 10:14:57
回答 2查看 1K关注 0票数 2

我决定第一次在Python3中使用Django 1.7,我需要能够使用包含latin1数据的遗留utf8数据库。我知道这很糟糕,但是数据库太大了,所以真的不可能改变它。所以我试着:

代码语言:javascript
复制
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连接器,安装如下

代码语言:javascript
复制
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

代码语言:javascript
复制
[client]
init-command='SET character_set_results = "latin1"'
# password, host, username

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

我试过跟着

代码语言:javascript
复制
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。有可能吗?我有办法解决这个问题吗?

非常感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-05 11:41:41

我终于想出来了(我不知道为什么我总是在发到这样的帖子后找到一个解决方案)。

代码语言:javascript
复制
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()

我以前用过甲骨文的python-mysql-connector试过它

RuntimeError: maximum recursion depth exceeded in comparison

但它适用于MySQL-driver py3分支。我想这可能是python-mysql-connectorDjango中的一个bug,我将向您报告。也许这能帮上忙。

票数 2
EN

Stack Overflow用户

发布于 2014-09-05 18:05:17

如果将mysql连接器python作为选项文件使用在client.cfg中,而不是init命令选项(连接器会忽略它),使用写,charset=latin1,就可以了。

代码语言:javascript
复制
[client]
charset=latin1
# password, host, username
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25683570

复制
相关文章

相似问题

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