При попытке передать параметр в подготовленный оператор с помощью pyodbc, Python возвращает UnicodeDecodingError.Однако при добавлении параметра непосредственно в подготовленную строку оператора такой ошибки не возникает.
Я работаю в Windows 10 (64-битная версия), используя библиотеку pyodbc в Python 3 и драйвер «Oracle in OraDB12Home1».Получение информации из базы данных работает нормально при добавлении всех параметров непосредственно в строку, содержащую операторы sql.
Вот два примера, которые выдают указанную ошибку
Пример 1
cursor = cnxn.cursor()
sql_statement = "select col1 from ? where col1 is not null;"
params = ("db_name")
cursor.execute(sql_statement,params)
Пример 2
cursor = cnxn.cursor()
sql_statement = "select col1 from db_name where col1 is not ?;"
params = ("null")
cursor.execute(sql_statement,params)
В обоих случаях возникает следующая ошибка:
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
~\AppData\Local\conda\conda\envs\fasttext\lib\encodings\utf_16_le.py in decode(input, errors)
15 def decode(input, errors='strict'):
---> 16 return codecs.utf_16_le_decode(input, errors, True)
17
UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 160-161: illegal encoding
Обратите внимание, что при выборе другогобаза данных (например, замена «db-name» на «Different_db_name») не работает, и все равно выдает ту же ошибку.
Ожидаемое поведение
Я ожидаю того жеРезультат, как в следующем примере, который работает без ошибок:
cursor = cnxn.cursor()
sql_statement = "select col1 from db_name where col1 is not null;"
cursor.execute(sql_statement)
Также обратите внимание, что передача различных параметров работает нормально.Например, выполнение следующего кода не вызывает ошибок, хотя единственным отличием от приведенных выше примеров является передаваемый параметр.
cursor = cnxn.cursor()
sql_statement = "select ? from db_name where col1 is not null;"
params = ("col1")
cursor.execute(sql_statement)