我在Fedora 27 ppc64(在IBM Power 720上)上将pyodbc(3.0.10-9)与Python 3(3.6.6-1)结合使用。我有一个非常简单的脚本,该脚本可以连接到MS SQL Server(W2K8R2上为2K8R2)数据库表,如下所示:
import time
import pyodbc
# import pyximport; pyximport.install()
def main():
cnxn = pyodbc.connect('DSN=something;UID=uu;PWD=pppp;', ansi=True)
cursor = cnxn.cursor()
cursor.execute('SELECT * FROM dbo.tb_Table;')
for row in cursor:
print(row)
if __name__ == '__main__':
time.sleep(3)
main()
input()
如果UID和PWD正确,则一切运行正常。
所以我在Windows服务器上停止了SQL Server服务,以便在Power7机器上看到错误消息。
但是,我在Mac OSX(10.11.6)终端和Fedora 27 gnome终端上收到此乱码错误:
Traceback (most recent call last):
File "podbc.py", line 16, in <module>
main()
File "podbc.py", line 6, in main
cnxn = pyodbc.connect('DSN=something;UID=uu;PWD=pppp;', ansi=True)
pyodbc.OperationalError: ('08S01', '[08S01] 嬀䘀爀攀攀吀䐀匀崀嬀匀儀䰀\u2000匀攀爀瘀攀爀崀唀渀愀戀氀攀\u2000琀漀\u2000挀漀渀渀攀挀琀㨀\u2000䄀搀愀瀀琀椀瘀攀\u2000匀攀爀瘀攀爀\u2000椀猀\u2000甀渀愀瘀愀椀氀愀戀氀攀\u2000漀爀\u2000搀漀攀猀\u2000渀漀琀\u2000攀砀椀猀琀 (20009) (SQLDriverConnect)')
为什么?如何将其“翻译”为可读(英语)形式?
感谢任何帮助或指点。
答案 0 :(得分:1)
更新:
您有一个经典案例mojibake。 ppc64默认为大端字节序,但是Microsoft SQL Server(因此也是FreeTDS)使用小端字节序,因此从服务器返回的UTF_16编码的消息将被处理:
>>> foo = '嬀䘀爀攀攀吀䐀匀崀嬀匀儀䰀\u2000匀攀爀瘀攀爀崀唀渀愀戀氀攀\u2000琀漀\u2000挀漀渀渀攀挀琀㨀\u2000䄀搀愀瀀琀椀瘀攀\u2000匀攀爀瘀攀爀\u2000椀猀\u2000甀渀愀瘀愀椀氀愀戀氀攀\u2000漀爀\u2000搀漀攀猀\u2000渀漀琀\u2000攀砀椀猀琀'
>>> foo.encode('utf-16be').decode('utf-16le')
'[FreeTDS][SQL Server]Unable to connect: Adaptive Server is unavailable or does not exist'
通常,人们会使用pyodbc的Connection.setdecoding
方法(描述为here)来解决字节序不匹配的问题,但是您的错误是在建立连接之前发生的。您可能需要针对自己的具体情况提出issue on GitHub。