使用pyodbc将非ASCII字符插入Teradata中的Unicode定义列

时间:2018-04-24 21:01:13

标签: python utf-8 odbc teradata pyodbc

我正在尝试使用pyodbc将列表列表插入到Teradata表中,目标列定义为varchar Unicode。

超出标准ascii 127代码点的任何字母似乎都以两个字符形式出现。例如,ü以表格的形式出现。

UTF-8字符也不正确。

'作为â和其后的两个不可打印的字符(PAD,根据记事本++的SGCI)

如果我将python脚本中的setencoding更改为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'

修改

一个例子,错误的文本和相应的十六进制(根据Teradata的char2hexint函数)

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

0 个答案:

没有答案