【发布时间】:2015-08-05 17:44:03
【问题描述】:
我使用 freetds(v0.95.19)/unixODBC(2.3.1)/pyodbc(3.0.7) 从 ubuntu 12.04 访问 MS SQL server 2012。我想检索包含非 ASCII 字符的 varchar(不是 nvarchar)的值。
如果我的 odbc.ini 文件是这样的
[mydb]
Driver = FreeTDS
Description = mydb description
Trace = No
Server = mydb.xxxxx.xxx
Database = XXX
Port = 1433
Charset = UTF-8
TDS_Version = 4.2
那么检索到的值为'\x841\x84\xc1\xcd\xc5;\x9b*\xf5\xb5\xc1}|\xcbX',也就是期望值。
但是,如果我只是将 TDS_Version 更改为 7.1,则检索到的值将变为 '?1?\xc1\xcd\xc5;?*\xf5\xb5\xc1}|\xcb',它会替换字符 '\x84' 和'\x9b' 和 '?'并且缺少字符串末尾的“X”。
我已经尝试了所有我能想到的方法(包括将 freetds、unixODBC 和 pyodbc 更新到最新的稳定版本),但到目前为止似乎没有任何帮助。使用 TDS 4.2 版还有一些其他问题,所以我真的希望让 7.1 版正常工作,但我无法弄清楚为什么检索到的 varchar 值不正确。
顺便说一句,我的 freetds.conf 文件有以下内容(这个文件中的 tds 版本是否为 7.1 似乎不影响我使用 pyodbc 得到的结果)。
[global]
tds version=4.2
[mydb]
host = mydb.xxxxx.xxx
tds version = 7.1
port = 1433
client charset = UTF-8
在 python (2.7.3) 中我会这样做
import pyodbc
conn=pyodbc.connect('DSN=mydb;DATABASE=XXX;UID=XXX;PWD=XXX')
cursor=conn.cursor()
cursor.execute("select myVarcharColumn from my.table where id=XXX").fetchone()
【问题讨论】:
标签: sql-server character-encoding pyodbc freetds unixodbc