pydbc 通过 ODBC 连接 return 字符串值中每个字母之间的空字符

pydbc via ODBC connection return null character between each letter in string value

我遇到了最奇怪的问题。 我通过 ODBC 连接到 Vertica 数据库使用 pyodbc 4.0.30 版本。

也在 MAC 上使用 python 版本 2.7。

我正在插入字符串值,例如:'daniel',而在执行 select 时,我得到一个每个字母之间包含空字符的值。

这是我的 odbc.ini 文件

[ODBC Data Sources]
vertica = Vertica

[vertica]
Driver                  = /Library/Vertica/ODBC/lib/libverticaodbc.dylib
Database                = qa
ServerName              = serverName
Port                    = 5433
UID                     = dbadmin
PWD                     = pass
DriverStringConversions = NONE
ColumnsAsChar = true

[ODBC]
Trace         = 0
TraceAutoStop = 0
TraceFile     = /Users/daniel/sql.log
TraceDLL      = 

字符串的 return 值假设为 'daniel' 并且我在 ascii

中得到以下值

[49, 0, 100, 0, 115, 0, 102, 0, 115, 0, 100, 0, 102, 0]

而不是

[49,100,115,102,115,100,102]

尝试了所有 DriverStringConversions 配置,但没有任何改变。 我知道这是不可能的,但知道为什么会这样吗?

这看起来像是编码问题。您似乎得到的是 UTF-16LE 而不是 UTF-8。为了让我的 Vertica 字符串正确来回,我在调用任何使用 ODBC 的程序之前有这个配置对 Vertica:

export ODBCSTACK=$HOME/odbcstack
export ODBCHOME=$ODBCSTACK/uodbc
export ODBCSYSINI=$ODBCHOME/etc
export ODBCINI=$ODBCSYSINI/odbc.ini
export VERTICAINI=$ODBCSYSINI/vertica.ini
# plus a few LD_LIBRARY_PATH and PATH settings

我的 vertica.ini 看起来像这样:

[Driver]
Locale = en_US
ODBCInstLib = /home/dbadmin/odbcstack/uodbc/lib/libodbcinst.so
ErrorMessagesPath = /opt/vertica
DriverManagerEncoding = UTF-16
LogPath = /tmp
LogNameSpace =
LogLevel = 0

如果没有 vertica.ini,我不会从 Vertica 收到任何合理的错误消息,而且字符编码会欺骗我。

试试吧!