2016-10-23 3 views
0

У меня есть база данных sql-сервера, размещенная на Azure. Я поместил строку в базу данных со смарт-кавычками («test»). Я могу подключиться к нему и запустить простой запрос:pymssql возвращает другую кодировку на Azure/Windows, чем на Mac

import pymssql 
import json 

conn = pymssql.connect(
    server='coconut.database.windows.net', 
    user='[email protected]', 
    password='********', 
    database='coconut', 
    charset='UTF-8', 
) 

sql = """ 
SELECT * FROM messages WHERE id = '548a72cc-f584-7e21-2725-fe4dd594982f' 
""" 
cursor = conn.cursor() 
cursor.execute(sql) 
row = cursor.fetchone() 
json.dumps(row[3]) 

Когда я запускаю этот запрос на моем Mac (MacOS 10.11.6, Python 3.4.4, pymssql 2.1.3) Я получаю обратно строку:

"\u201ctest\u201d" 

Это правильно интерпретируется как умные кавычки и отображается правильно.

Когда я запускаю этот запрос на Azure развертывание веб (Python 3.4, Azure App службы) Я вернусь другой (и неправильно) кодирования для той же строки:

"\u0093test\u0094" 

я определил кодировку как " UTF-8 'на соединение pymssql. Почему среда Windows/Azure возвращает другую кодировку?

(примечание: я поставил предварительно построенный двоичный файл pymssql-2.1.3-cp34-none-win32.whl в рулевой рубке моего проектного репо на Azure. Это то же самое, что и предварительно созданный двоичный pymssql pymssql -2.1.3-cp34-cp34m-win32.whl только на PyPI Мне пришлось переименовать 'cp34m' в 'none', чтобы убедить pip для его установки.)

ответ

2

Согласно вашему описанию, я думаю, кажется, что проблема была вызвана кодировкой кодировки по умолчанию для базы данных SQL на Azure. Для проверки моей мысли я провел некоторое тестирование ниже в Python 3.

Кодировка кодировки SQL базы данных по Azure по умолчанию - Windows-1252 (CP-1252).

SQL Server Collation Support
базы данных по умолчанию параметры сортировки, используемый Microsoft Azure SQL Database является SQL_Latin1_General_CP1_CI_AS, где Latin1_General является английский (США), CP1 является кодовая страница 1252, CI нечувствителен к регистру, и AS является accent- чувствительны. Невозможно изменить сортировку для баз данных V12. Дополнительные сведения о настройке сопоставления см. В разделе COLLATE (Transact-SQL).

>>> u"\u201c".encode('cp1252') 
b'\x93' 
>>> u"\u201d".encode('cp1252') 
b'\x94' 

В коде выше показанном \u0093 & \u0094 можно получить с помощью кодирования \u201c & \u201d.

И

>>> u"\u0093".encode('utf-8') 
b'\xc2\x93' 
>>> u"\u0093".encode('utf-8').decode('cp1252')[1] 
'“'  # It's `\u201c` 
>>> u"\u201c" == u"\u0093".encode('utf-8').decode('cp1252')[1] 
True 

Так что я думаю, что набор символов кодирования текущей базы данных SQL для хранения данных Latin-1, не UTF-8, при создании базы данных SQL, как на рисунке ниже, свойства по умолчанию Collation на Лазурный портал SQL_Latin1_General_CP1_CI_AS. Попробуйте использовать другую поддержку сопоставления UTF-8 вместо стандартной.

enter image description here

+0

Интересно. Я использую сопоставление по умолчанию SQL_Latin1_General_CP1_CI_AS. Когда я запускаю sys.stdin.encoding "на моем Mac я получаю« utf-8 », а на Azure я получаю« cp1252 ». Интересно, используется ли стандартная кодировка символов python для использования символов Unicode. Только я не могу понять, как это сделать« chcp 65001 "на Azure перед запуском Python ... – Wheat

1

Я в конечном итоге переделки тип столбца из VARCHAR в NVARCHAR. Это решило мою проблему, символы правильно интерпретируются, независимо от платформы.

+0

Отлично. Спасибо за ваш обмен. –