Я подключаюсь к серверу MS SQL через SQL Alchemy, используя модуль pyodbc. Кажется, все работает нормально, пока у меня не возникли проблемы с кодировками. Некоторые символы, отличные от ascii, заменяются на «?»
БД имеет параметры сортировки 'Latin1_General_CI_AS' (я проверил также определенные поля, и они сохраняют те же параметры сортировки). Я начал выбирать кодировку 'latin1' в вызове create_engine
, и это, кажется, работает для западноевропейских символов (например, французского или испанского, например, é
), но не для пасхально-европейских символов. Конкретно у меня проблема с персонажем ć
Я пытался выбрать другие кодировки , как указано в документации Python , в частности, Microsoft, например cp1250
и cp1252
, но я продолжаю сталкиваться с той же проблемой.
Кто-нибудь знает, как решить эти различия? Имеет ли сопоставление Latin1_General_CI_AS эквивалентность кодировкам Python?
Код моего текущего соединения:
for sqlalchemy import *
def connect():
return pyodbc.connect('DSN=database;UID=uid;PWD=password')
engine = create_engine('mssql://', creator=connect, encoding='latin1')
connection = engine.connect()
Разъяснения и комментарии:
- Эта проблема возникает при получении информации из БД. Мне не нужно ничего хранить.
- В начале я не указывал кодировку, и в результате получалось, что всякий раз, когда в БД встречается символ не ascii, pyodbc вызывает UnicodeDecodeError. Я исправил это, используя 'latin1' в качестве кодировки, но это не решает проблему для всех символов.
- Я признаю, что сервер не на латинице 1, комментарий неверный. Я проверял как параметры сортировки базы данных, так и параметры конкретных полей, и похоже, что все они в 'Latin1_General_CI_AS', тогда как можно сохранить
ć
? Может быть, я не правильно понимаю сопоставления.
- Я немного исправил вопрос, в частности, я пробовал больше кодировок, чем
latin1
, а также cp1250
и cp1252
(который, по-видимому, используется в 'Latin1_General_CI_AS', согласно msdn)
UPDATE:
ОК, после этих шагов я получаю, что кодировка, используемая БД, выглядит как cp1252: http://bytes.com/topic/sql-server/answers/142972-characters-encoding
Во всяком случае, это кажется плохим предположением, отраженным в ответах.
UPDATE2:
В любом случае, после правильной настройки драйвера odbc мне не нужно указывать кодировку в коде Python.