Как кодировать строки Unicode с помощью pyodbc для сохранения в наборе данных SAS?

Я использую Python для чтения и записи наборов данных SAS, используя pyodbc и драйверы SAS ODBC. Я могу отлично загрузить данные, но когда я сохраняю данные, используя что-то вроде:

cursor.execute('insert into dataset.test VALUES (?)', u'testing')

... Я получаю ошибку pyodbc.Error: ('HY004', '[HY004] [Microsoft][ODBC Driver Manager] SQL data type out of range (0) (SQLBindParameter)').

Проблема, похоже, в том, что я передаю строку юникода; что мне нужно сделать, чтобы справиться с этим?


person Chris B.    schedule 24.05.2010    source источник


Ответы (2)


Знаете ли вы, какую кодировку символов ожидает ваша база данных? Если это так, вы можете попробовать закодировать строку Unicode перед выполнением запроса. Итак, если ваша база данных ожидает строки utf-8, вы можете попробовать что-то вроде:

encoding = 'utf-8' # or latin1 or cp1252 or something
s = u'testing'.encode(encoding)
cursor.execute('insert into dataset.test VALUES (?)', s)
person Will McCutchen    schedule 24.05.2010
comment
Кодирование не упоминается в документации pyodbc или документации SAS ODBC. Так что, одним словом, нет. Я мог бы просто протестировать кучу кодировок, но понятия не имею, как убедиться, что я использую правильную кодировку, если система работает на другом компьютере. - person Chris B.; 25.05.2010

Вы говорите: «Я отлично могу загружать данные»… значит ли это, что вы можете загружать данные, содержащие символы, которые НЕ относятся к родной кодировке, используемой на вашей платформе (предположительно, cp1252 в Windows, но, пожалуйста, подтвердите)? Каков тип данных SAS для первого столбца вашего набора данных SAS?

Эта статья в документах SAS призвана показать, как узнать кодировку, используемую в наборе данных SAS.

Кодировка упоминается в документация SAS ODBC. Однако вы, похоже, не используете SAS ODBC (т. е. сценарий на языке SAS для доступа к данным, отличным от SAS).

person John Machin    schedule 24.05.2010
comment
Когда я говорю, что могу отлично загрузить данные, я имею в виду, что они приходят в виде строки Unicode, а не в виде байтов. И я использую внешние драйверы SAS ODBC, не вызывая SQL из сценария SAS. - person Chris B.; 25.05.2010
comment
По поводу вашего комментария: 1-е предложение: пожалуйста, ответьте на эти вопросы явно (0) вы имеете в виду, что это происходит как объект юникода Python, а не как объект str (1) можете ли вы загружать данные, содержащие символы юникода, которые НЕ используются в родной кодировке на вашей платформе (2) какая у вас платформа (3) какова собственная кодировка на вашей платформе (4) Каков тип данных SAS для первого столбца вашего набора данных SAS? ... 2-е предложение: ага, я так и догадался, не так ли? Пожалуйста, попробуйте узнать кодировку, используемую в вашем наборе данных SAS. Отредактируйте свой вопрос, чтобы добавить новую информацию, не делайте этого в комментарии. - person John Machin; 25.05.2010