【问题标题】:How to set character_set_results latin1 mysql in Django?如何在 Django 中设置 character_set_results latin1 mysql?
【发布时间】:2015-06-21 18:58:03
【问题描述】:

当db使用latin1编码时,我不知道如何连接到mysql db。 我正在尝试关注文档,我正在使用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

我也找到https://stackoverflow.com/a/25685134/523075 但是不知道怎么实现。

因为我所有的表都使用 latin1,而我的问题是如何为 django 光标设置 character_set_results,因为我使用 django 和 sweetpie 开发移动 api。我也有模型和资源。

【问题讨论】:

    标签: python mysql django character-encoding latin1


    【解决方案1】:

    第一行应该是Phẩm Bồ tát hạnh 吗?如果是这样,可能是这样的:

    • 客户端中有 utf8 编码的字节
    • 你执行了SET NAMES latin1(或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)
    

    【讨论】:

    • 但我不想接触当前数据库,因为它已经有很多服务在使用这个数据库。
    【解决方案2】:

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

    # 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\'')
    

    【讨论】:

    • 请注意,MySQLdb.python 模块有一个 set_character_set method,它可能会解决一些问题,而不仅仅是正确读取一些非 ascii 字符。
    猜你喜欢
    • 2014-10-30
    • 2015-04-15
    • 2021-03-09
    • 2013-07-13
    • 2023-03-06
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多