Проблема кодирования Python с пандами read_sql - PullRequest
0 голосов
/ 03 июля 2018

Итак, я пытаюсь закодировать две строки в utf-8, чтобы я мог использовать их с pandas.read_sql:

selectedTable = "ACC__AccountCodes"
baseSql = "SELECT * FROM FileMaker_Fields WHERE TableName="

Теперь, когда я кодирую эти две вещи:

baseSql.encode('utf-8')
selectedTable.encode('utf-8')
sqlString = "{}{}".format(baseSql, selectedTable)

Мой вывод выглядит так:

b'SELECT * FROM FileMaker_Fields WHERE TableName='b'A\x00C\x00C\x00_\x00_\x00A\x00c\x00c\x00o\x00u\x00n\x00t\x00C\x00o\x00d\x00e\x00s\x00''

Поэтому, когда я запускаю его с кодировкой 'latin1', я получаю ошибку:

pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT * FROM FileMaker_Fields WHERE TableName=ACC__AccountCodes': ('HY000', '[HY000] [\x00F\x00i\x00l\x00e\x00M\x00a\x00k\x00e\x00r\x00]\x00[\x00F\x00i\x00l\x00e\x00M\x00a\x00k\x00e\x00r\x00]\x00 \x00F\x00Q\x00L\x000\x000\x000\x007\x00/\x00(\x001\x00:\x004\x007\x00)\x00:\x00 \x00T\x00h\x00e\x00 \x00c\x00o\x00l\x00u\x00m\x00n\x00 \x00n\x00a\x00m\x00e\x00d\x00 \x00"\x00A\x00"\x00 \x00d\x00o\x00e\x00s\x00 \x00n\x00o\x00t\x00 \x00e\x00x\x00i\x00s\x00t\x00.....

Кажется, я не могу найти ничего, что решает эту проблему. Все, что я пробовал, приводит меня к этому, что вызывает ошибку SQL для неправильного синтаксиса. Я использую pyodbc, который ожидает кодирование utf-8 в качестве ввода. Мысли

1 Ответ

0 голосов
/ 03 июля 2018

Вам не нужно кодировать их как utf-8; Попробуйте передать их как обычные строки в функцию pandas read_sql, она должна работать нормально, если нет, то у вас есть проблема где-то еще ... но кодирование здесь не то, что вам нужно.

Pyodbc принимает Unicode-строки в запросе как обычно, так что это совсем не ваша проблема.

Я предлагаю также прочитать раздел Unicode в документации по pyodbc , который содержит конкретную конфигурацию Unicode для некоторых баз данных, хотя в вашем случае я не вижу в этом проблемы вообще, потому что это связано с кодировкой драйвера базы данных, а не с вашим SQL-запросом, который каждый раз должен быть обычной строкой Юникода.

...