Python 如何在Django中设置字符\u set\u结果latin1 mysql?

Python 如何在Django中设置字符\u set\u结果latin1 mysql?,python,mysql,django,character-encoding,latin1,Python,Mysql,Django,Character Encoding,Latin1,当数据库使用拉丁编码时,我不知道如何连接到mysql数据库。 我正在尝试并遵循文档,我正在使用mysqlclient==1.3.5这里是我的数据库连接设置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test_api', 'USER': 'admin', 'PASSWORD': '123456', 'HOS

当数据库使用拉丁编码时,我不知道如何连接到mysql数据库。 我正在尝试并遵循文档,我正在使用
mysqlclient==1.3.5
这里是我的数据库连接设置

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
我也发现 但我不知道如何实现它


因为我所有的表都使用拉丁文1,我的问题是如何为django游标指定结果,因为我使用django和tastypie来开发移动api。我也有模型和资源。

第一行应该是
Phẩ文学硕士ồ tát hạnh
?如果是这样的话,情况可能就是这样:

  • 客户端中有utf8编码的字节
  • 您执行了
    SET NAMES latin1
    (或python/django中的等效项)
  • 表中的列已声明为
    字符集latin1
一切都需要ut8。但要修复数据,您需要的是

  • ALTER TABLE Tbl修改列col VARBINARY(…)
  • ALTER TABLE Tbl修改列col VARCHAR(…)。。。字符集utf8
其中长度足够大,而另一个“…”具有列上已经存在的其他内容(非NULL等)

建议您在生产之外进行测试

编辑

数据库中有垃圾。任何试图通过快捷方式修复表的尝试都可能导致更糟糕的混乱

这可能会使输出“看起来”正确:


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

# 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\'')
这就需要接线了

这应该适用于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\'')

但是我不想涉及当前的数据库,因为它已经有很多服务使用这个数据库了。请注意,
MySQLdb.python
模块有一个新的功能,除了正确读取一些非ascii字符之外,它还可以解决一些问题。
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\'')