Как установить символьный_символ latin1 mysql в Django?

Я не знаю, как подключиться к mysql db, когда db использует latin1 encode. Что я пытаюсь следовать документу, и я использую 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

Я также нахожу /questions/18760291/nevozmozhno-ustanovit-znachenie-charactersetresults-dlya-latin1/18760299#18760299 Но не знаю, как это реализовать.

Потому что во всей моей таблице используется latin1, и мой вопрос в том, как character_set_results для курсора django, потому что я использую django и tastypie для разработки мобильных API. У меня также есть модель и ресурс.

2 ответа

Была ли первая строка Phẩm Bồ tát hạnh? Если так, то, вероятно, именно это и произошло:

  • Вы имели utf8-кодированные байты в клиенте
  • Вы казнили SET NAMES latin1 (или эквивалент в Python/ Django)
  • Столбец в таблице был объявлен CHARACTER SET latin1

Все должно быть ut8. Но чтобы исправить данные, вам нужен 2-х шаговый 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)

Я решил похожую проблему, используя следующий сигнал:

# 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\'')
Другие вопросы по тегам