Вставка не-ASCII символов в столбец, определенный в Unicode в Teradata, используя pyodbc - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь использовать pyodbc для вставки списка списков в таблицу Teradata с целевым столбцом, определенным как varchar Unicode.

Любая буква, выходящая за пределы стандартной кодовой точки ascii 127, выглядит как два символа,Например, ü входит в таблицу как ü.

Символы UTF-8 также встречаются неправильно.

'отображается как â и два непечатаемых символа после него (PAD и SGCI согласно notepad ++)

Если я изменяюпри setencoding в скрипте python для latin1 он вставляет латинские символы правильно, но, конечно, когда он получает не латинский символ (в моем случае \ u2019), он выходит с порядковым номером, не находящимся в диапазоне ошибок.

Символы под кодом 127 встречаются нормально.Когда я печатаю строку в консоли после установки PYTHONIOENCODING = UTF-8 и непосредственно перед вставкой, строка выглядит так, как должна, я вижу значок ü.И '

РЕДАКТИРОВАТЬ 2:

Оказывается, это может вообще не иметь никакого отношения к pyodbc

           print(item)
           print(item.encode('utf-8'))

Выход:

Classificação

b'Classifica \ xc3 \ xa7 \ xc3 \ xa3o '

И эти кодовые точки соответствуют тому, что я вижу в базе данных:

çà £

Переменная item типа str.

Разве байтовая строка не должна быть e7 и e3?другими словами:

b'Classifica \ xe7 \ xe3o '

РЕДАКТИРОВАТЬ:

Пример, неверный текст и соответствующий гекс (в соответствии сФункция char2hexint от Teradata)

açà £ o, 006100C300A700C300A3006F

Я ожидаю: ação, 006100E700E3006F

В соответствии с документацией pyodbc: https://github.com/mkleehammer/pyodbc/wiki/Unicode У меня есть настройкамое соединение выглядит следующим образом:

cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8') 

cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8') 

cnxn.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-8') 

cnxn.setencoding(encoding='utf-8')

Программное обеспечение

    Red Hat Enterprise Linux Server release 7.3 (Maipo) 
    Teradata Drivers 15.10.01.14 
    Teradata Database version 15.10.X 
    Python version: Anaconda - Python 3.6.3  
    Pyodbc version: pyodbc-4.0.17 

Это запись DSN:

   [server] 
    Driver=<validpath>/ODBC_64/lib/tdata.so 
    Description=Teradata ODBC 
    CharacterSet=UTF8 
    DBCName=server 
    EnableDataEncryption=Yes 
    EnableLOBs=Yes 
    EnableReconnect=No 
    IntegratedSecurity=No 
    LoginTimeout=20 
    MapCallEscapeToExec=No 
    MaxRespSize=1048576 
    PortNumber=1025 
    PrintOption=N 
    ProcedureWithSplSource=Y 
    ReportCodePageConversionErrors=0 
    ShowSelectableTables=Yes 
    Trace=Yes 
    TraceFile=/tmp/trace.log
...