我使用Python 3.5 + pyodbc(在Windows 10上)在服务器上应用一些SQL查询,一切都做得很好:
In [1]: import pyodbc
...:
In [2]: server = 'tcp:192.168.100.76'
...: database = 'database'
...: username = 'username'
...: password = 'password'
...:
In [3]: cnxn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+use
...: rname+';PWD='+ password)
...: cursor = cnxn.cursor()
In [29]: sqlQuery = "SELECT TOP 50 * " + \
...: "FROM dbo.DS10_CIBBASE " + \
...: "LEFT JOIN dbo.DS10_CIBCITY AS O_CITY ON dbo.DS10_CIBBASE.O_CITY=O_CITY.CITYCODE " + \
...: "LEFT JOIN dbo.DS10_CIBCITY AS B_CITY ON dbo.DS10_CIBBASE.B_CITY=B_CITY.CITYCODE " + \
...: "LEFT JOIN dbo.DS10_CIBMETH AS METHOD1 ON dbo.DS10_CIBBASE.METHOD1=METHOD1.METHCODE " + \
...: "LEFT JOIN dbo.DS10_CIBMETH AS METHOD2 ON dbo.DS10_CIBBASE.METHOD2=METHOD2.METHCODE " + \
...: "LEFT JOIN dbo.DS10_CIBMETH AS METHOD3 ON dbo.DS10_CIBBASE.METHOD3=METHOD3.METHCODE " + \
...: "LEFT JOIN dbo.DS10_CIBPERS ON dbo.DS10_CIBBASE.BASENO=dbo.DS10_CIBPERS.BASENO " + \
...: "LEFT JOIN dbo.DS10_CIBFEAT ON dbo.DS10_CIBPERS.FEATURE=dbo.DS10_CIBFEAT.FEATCODE " + \
...: "LEFT JOIN dbo.DS10_CIBOCCU ON dbo.DS10_CIBPERS.OCCUPATION= dbo.DS10_CIBOCCU.OCCUCODE " + \
...: "LEFT JOIN dbo.DS10_CIBEDUC ON dbo.DS10_CIBPERS.EDU=dbo.DS10_CIBEDUC.EDUCCODE " + \
...: "LEFT JOIN dbo.DS10_CIBCITY AS L_CITY ON dbo.DS10_CIBPERS.CITY=L_CITY.CITYCODE ;"
In [30]: cursor.execute(sqlQuery)
Out[30]: <pyodbc.Cursor at 0x262625e5750>
到目前为止一直很好,然后我稍微更改了一下查询:
In [31]: sqlQuery0 = "SELECT TOP 50 * " + \
...: "FROM dbo.LAB1_EXP3_CARNO1 ; "
In [32]: cursor.execute(sqlQuery0)
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-32-769696011e11> in <module>()
----> 1 cursor.execute(sqlQuery0)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa8 in position 0: invalid start byte
我无法理解为什么之前的查询没问题,而后来遇到了 UnicodeDecodeError ,因为所有查询都是用ASCII字符编写的。那么我做错了什么,我怎么能摆脱这个错误?
答案 0 :(得分:2)
你得到的是因为你的数据不是UTF-8编码的(\U00A8
是“间隔分音符”,而且\xA8
在Latin-1中是相同的,但是\xA8
是拉丁语15 š
。
错误不是因为查询具有非ascii字符(显然,它没有),但是因为结果返回了一串不是UTF-8编码的8位字符。
对于SQL Server,您可以使用cast
或convert
将导致错误的varchar
列更改为nvarchar
(UTF-16 Unicode)值。