2015-04-15 40 views
0

当db使用latin1编码时,我不知道如何连接到mysql db。 我尝试并按照文档,我正在使用mysqlclient==1.3.5这里是我的数据库连接设置。如何在Django中设置character_set_results latin1 mysql?

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'test_api', 
     'USER': 'admin', 
     'PASSWORD': '123456', 
     'HOST': '192.168.59.103', 
     'PORT': '3306', 
     'OPTIONS': { 
      'charset': 'latin1', 'use_unicode': False 

     }, 
    } 
} 

37 Phẩm Bồ tát hạnh 
Am mây ngủ 
An cứ kiết hạ 
An lạc từ tâm 
An lạc từng bước chân 
Ãnh Sáng Từ Bi 

但它没有成功,所以接下来我尝试使用pymysql在下面编写一个简单的脚本,它工作正常。

# -*- coding: utf-8 -*- 
import pymysql 
connection = pymysql.connect(host='192.168.59.103', port=3306, user='admin', passwd='123456', db='test_api', use_unicode=False) 

customers = connection.cursor(pymysql.cursors.DictCursor) 
customers.execute('SET character_set_results=\'latin1\'') 
customers.execute('SELECT * FROM bz_media_album ORDER BY name_vn') 
for customer in customers: 
    print customer['name_vn'] 

37 Phẩm Bồ tát hạnh 
Am mây ngủ 
An cứ kiết hạ 
An lạc từ tâm 
An lạc từng bước chân 
Ánh Sáng Từ Bi 

我也觉得https://stackoverflow.com/a/25685134/523075 但不知道如何实现它。

因为我所有的表使用latin1的,我的问题是如何character_set_results Django的游标,因为我使用Django和tastypie开发移动API。我也有模型和资源。

回答

1

第一行应该是Phẩm Bồ tát hạnh?如果是这样,可能这是发生了什么事:

  • 您已在客户端
  • 您执行SET NAMES latin1 UTF8编码的字节(或在Python/Django的等效)
  • 在表中的列被宣布CHARACTER SET latin1

一切都需要ut8。但要修复数据,你需要的2-step ALTER,从而有效地说道做

  • ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
  • ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

,其中长度足够大,其他的“...”有其他任何(NOT NULL等)已经在列上。

建议您测试此外部制作。

编辑

您在数据库中的垃圾。任何试图快速修复表格的尝试都可能导致更糟糕的混乱。

可能使输出的 “看” 的权利:

CONVERT(BINARY(column_name) USING utf8) 
+0

但我不希望在当前的分贝触摸,因为它有很多使用该数据库已经服务。 – giaosudau

1

我使用下面的信号解决了类似的问题:

# apps.my_app.signals.py 
from django.db.backends.signals import connection_created 
from django.dispatch import receiver 


@receiver(connection_created) 
def set_character_set_results(*args, connection, **kwargs): 
    with connection.cursor() as cursor: 
     cursor.execute('SET CHARACTER_SET_RESULTS = \'latin1\'') 

这则需要连接最多in the usual way

这应该与MySQL 4.1或更高版本的工作。

我们的用例,从其中我们也不想改变的编码,因为它是被读取和遗留系统写入到一个MySQL数据库读取。我们也有另一个(Postgres的)数据库,因此实际的代码更像是:

from django.db.backends.signals import connection_created 
from django.dispatch import receiver 


@receiver(connection_created) 
def set_character_set_results(*args, connection, **kwargs): 
    if connection.alias == 'legacy': 
     with connection.cursor() as cursor: 
      cursor.execute('SET CHARACTER_SET_RESULTS = \'latin1\'') 
+0

请注意,'MySQLdb.python'模块有一个['set_character_set'方法](https://github.com/farcepest/MySQLdb1/blob/d34fac681487541e4be07e6978e0db233faf8252/MySQLdb/connections.py#L301),这可能会解决问题除了正确读取一些非ASCII字符之外。 – Jonathan