2014-07-25 2 views
0

У меня есть приложение django, использующее pyodbc для общения с базой данных MS SQL Server с кодировкой Latin1_General_CI_AI. (Я не имею никакого контроля над этой базой данных и не может изменить кодировку.)Django pyodbc Latin1_General_CI_AI encoding

Проблема заключается в том, что каждая строка происходит из Джанго -> pyodbc должен быть закодирован:

Например:

m = MyModel() 
m.foo = 'foo' # Garbage characters are saved 
m.foo = 'foo'.encode('latin1') # String is saved correctly 
m.save() 

Вторая проблема заключается в том, что строки запроса также должны быть закодированы:

MyModel.objects.get(name=name) # fails 
MyModel.objects.get(name=name.encode('latin1')) # works 

Есть ли более общий способ, с помощью которого я могу справиться? Либо модель mixin, либо бэкэнд БД? Я вижу места в SQLCompiler Django, но не знаю, как это повлиять на него.

ответ

0

У меня было что-то похожее, и у меня было подобное обходное решение.

Для меня, добавление параметра подключения ClientCharset=utf8 устранило проблему. При использовании django-pyodbc, как и я, это означает, что вы добавляете: 'OPTIONS': { 'extra_params': 'ClientCharset=utf8', } в настройки вашей базы данных. Если вы используете pyodbc напрямую, вы можете просто добавить это в свою строку соединения.

Трюк здесь (из того, что я могу сказать) заключается в том, что ваш драйвер TDS уже пытается перевести из исходной базы данных в соответствующую стандартную кодировку для чтения вашим клиентом. Поскольку мы говорим о том, что Microsoft находится здесь, подходящим стандартом является ISO 8859-1 (не помню, является ли это точно латинским-1, или если это так близко, что люди не склонны замечать разницу). Вот почему ваш обходной путь работает. См. here для получения дополнительной информации.

Django ожидает, что базы данных будут talking utf-8, поэтому все, что мы делаем здесь, это сказать драйверу TDS, что мы хотим услышать.

Смежные вопросы