2015-12-15 2 views
1

У меня есть ms sql-сервер, и мне нужно получить доступ к его базе данных на компьютере ubuntu. поэтому я использую freetds/pyodbc для запроса данных.Не удается получить правильный результат при запросе с pyodbc

ОС: Ubuntu 14,04
pyodbc: pyodbc-3.0.10

Когда MS SQL Server имеет специальный символ (ß), я не могу получить правильный результат.

cnxn = pyodbc.connect(
     'DRIVER=FreeTDS;' 
     'SERVER=10.1.1.1;' 
     'PORT=1433;' 
     'DATABASE=db;' 
     'UID=sa;' 
     'PWD=111;' 
     'CHARSET=UTF-8;' 
     'unicode_results=True' 
     'TDS_Version=8.0') 
cursor.execute("select * from test") 
for row in cursor.fetchall(): 
    print row[0] 

строки [0] будет содержать символ бета, но когда я использую "".join("{:02x}".format(ord(c)) for c in row[0]).
я обнаружил, что строка использовать 0xdf для ß, от http://lwp.interglacial.com/appf_01.htm, 0xdf сырое кодирование, так как UTF8, она должна быть 0xC3,0x9F.

Почему pyodbc не возвращают данные кодирования UTF8, и как я могу расшифровать его в Python 2.7, спасибо ~

+0

У SQL Server может не быть свойство 'charset'. Попробуйте кодировать строку в Python: 'row.encode ('utf-8')'. И посмотрите на это [SO post] (http://stackoverflow.com/questions/947077/using-pyodbc-on-linux-to-insert-unicode-or-utf-8-chars-in-a-nvarchar-mssql -field). – Parfait

ответ

1

Несколько вещей, чтобы проверить:

  • Убедитесь, что столбец вы выбираете из на SQL Server - NVARCHAR, NCHAR или NTEXT. (похоже, из вашего примера)
  • TDS_VERSION 8.0 не существует; FreeTDS возвращается к 7.1, когда предоставляется 8.0. Версия TDS 7.1 не поддерживает NVARCHAR или NTEXT, поскольку она была введена в SQL Server 2008. Используйте TDS_VERSION 7.2 или 7.3.
  • Используйте команду tsql -C, чтобы увидеть, что FreeTDS версию вы используете. Если версия 0.95, вы можете использовать 7.3, если 0.91, используйте 7.2.

Вам также придется обрабатывать Unicode в Python 2.7 самостоятельно. Python 3.4 или 3.5 упростит вашу жизнь при работе с Unicode!

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