Как установить символьный_символ 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\'')