pyodbc использует спецификацию ODBC, которая поддерживает только 2 кодировки.Все функции ODBC, оканчивающиеся на 'W', являются версиями с широкими символами, использующими SQLWCHAR.Это определяется заголовками ODBC и обычно является UCS2, но иногда является UCS4.В нешироких версиях используется SQLCHAR и они всегда (?) Являются однобайтовыми ANSI / ASCII.
В ODBC нет абсолютно никакой поддержки кодировок с переменной шириной, таких как UTF8.Если драйверы ODBC предоставляют это, это абсолютно неправильно.Даже если данные хранятся в UTF8, драйвер должен конвертировать их в ANSI или UCS2.К сожалению, большинство драйверов ODBC совершенно неверны.
При отправке в драйвер pyodbc будет использовать ANSI, если данные являются объектом 'str', и будет использовать UCS2 / UCS4 (независимо от того, какой SQLWCHAR определен для вашей платформы)если данные являются объектом «Юникод».Драйверы определяют, являются ли данные SQLCHAR или SQLWCHAR при их возврате, и pyodbc не имеет права голоса в этом вопросе.Если это SQLCHAR, он преобразуется в объект 'str', а если SQLWCHAR преобразуется в объект 'Unicode'.
Это будет немного отличаться для версий 3.x, которые преобразуют как SQLCHAR, так и SQLWCHAR вЮникод по умолчанию.