使用 pyodbc 查询时无法获得正确结果
Can not get correct result when query with pyodbc
我有一个 MS sql 服务器,我需要在 ubuntu 电脑上访问它的数据库。所以我使用 freetds/pyodbc 来查询数据。
OS: ubuntu 14.04
pyodbc:pyodbc-3.0.10
当 ms sql 服务器有特殊字符 (ß) 时,我无法得到正确的结果。
cnxn = pyodbc.connect(
'DRIVER=FreeTDS;'
'SERVER=10.1.1.1;'
'PORT=1433;'
'DATABASE=db;'
'UID=sa;'
'PWD=111;'
'CHARSET=UTF-8;'
'unicode_results=True'
'TDS_Version=8.0')
cursor.execute("select * from test")
for row in cursor.fetchall():
print row[0]
row[0] 将包含字符 ß,但是当我使用 "".join("{:02x}".format(ord(c)) for c in row[0])
.
我发现0xdf
for ß,来自http://lwp.interglacial.com/appf_01.htm,0xdf
是原始编码,作为UTF8,它应该是0xC3,0x9F
.
为什么 pyodbc 不 return UTF8 编码数据,我如何在 python 2.7 中解码它,谢谢~
需要检查的几件事:
- 确保您在 SQL 服务器上选择的列是 NVARCHAR、NCHAR 或 NTEXT。 (这似乎来自你的例子)
- TDS_VERSION 8.0 不存在;当提供 8.0 时,FreeTDS 回落到 7.1。 TDS 7.1 版不支持 NVARCHAR 或 NTEXT,因为它是在 SQL Server 2008 中引入的。使用 TDS_VERSION 7.2 或 7.3。
- 使用命令
tsql -C
查看您使用的 FreeTDS 版本。如果是0.95版本,可以用7.3,如果是0.91,就用7.2.
您还必须自己处理 Python 2.7 中的 Unicode。 Python 3.4 或 3.5 将使您在使用 Unicode 时的生活更加轻松!
我有一个 MS sql 服务器,我需要在 ubuntu 电脑上访问它的数据库。所以我使用 freetds/pyodbc 来查询数据。
OS: ubuntu 14.04
pyodbc:pyodbc-3.0.10
当 ms sql 服务器有特殊字符 (ß) 时,我无法得到正确的结果。
cnxn = pyodbc.connect(
'DRIVER=FreeTDS;'
'SERVER=10.1.1.1;'
'PORT=1433;'
'DATABASE=db;'
'UID=sa;'
'PWD=111;'
'CHARSET=UTF-8;'
'unicode_results=True'
'TDS_Version=8.0')
cursor.execute("select * from test")
for row in cursor.fetchall():
print row[0]
row[0] 将包含字符 ß,但是当我使用 "".join("{:02x}".format(ord(c)) for c in row[0])
.
我发现0xdf
for ß,来自http://lwp.interglacial.com/appf_01.htm,0xdf
是原始编码,作为UTF8,它应该是0xC3,0x9F
.
为什么 pyodbc 不 return UTF8 编码数据,我如何在 python 2.7 中解码它,谢谢~
需要检查的几件事:
- 确保您在 SQL 服务器上选择的列是 NVARCHAR、NCHAR 或 NTEXT。 (这似乎来自你的例子)
- TDS_VERSION 8.0 不存在;当提供 8.0 时,FreeTDS 回落到 7.1。 TDS 7.1 版不支持 NVARCHAR 或 NTEXT,因为它是在 SQL Server 2008 中引入的。使用 TDS_VERSION 7.2 或 7.3。
- 使用命令
tsql -C
查看您使用的 FreeTDS 版本。如果是0.95版本,可以用7.3,如果是0.91,就用7.2.
您还必须自己处理 Python 2.7 中的 Unicode。 Python 3.4 或 3.5 将使您在使用 Unicode 时的生活更加轻松!