我正在尝试使用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