为什么pyodbc在Fedora 27 ppc64上生成乱码错误信息?
Why does pyodbc generate garbled error messages on Fedora 27 ppc64?
我在 Fedora 27 ppc64(在 IBM Power 720 上)上使用带有 Python 3 (3.6.6-1) 的 pyodbc (3.0.10-9)。我有一个连接到 MS SQL 服务器(W2K8R2 上的 2K8R2)数据库 table 的非常简单的脚本,如下所示:
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服务器服务,以便在Power7机器上看到错误信息。
但是,我在 Mac OSX (10.11.6) 终端和 Fedora 27 gnome-terminal 上收到这个乱码:
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)')
为什么?我怎样才能 "translate" 把它变成可读的(英文)形式?
感谢任何帮助或指点。
pyodbc 3.0.10 很旧。升级到最新版本(当前为 4.0.24)。它包括 this issue.
的修复
更新:
你有mojibake的经典案例。 ppc64 默认为大端字节排序,但 Microsoft SQL 服务器(以及 FreeTDS)使用小端字节排序,因此从服务器返回的 UTF_16-encoded 消息被破坏:
>>> 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) to work around the mismatch in endian-ness, but your error is happening before the connection is established. You may want to raise an issue on GitHub。
我在 Fedora 27 ppc64(在 IBM Power 720 上)上使用带有 Python 3 (3.6.6-1) 的 pyodbc (3.0.10-9)。我有一个连接到 MS SQL 服务器(W2K8R2 上的 2K8R2)数据库 table 的非常简单的脚本,如下所示:
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服务器服务,以便在Power7机器上看到错误信息。
但是,我在 Mac OSX (10.11.6) 终端和 Fedora 27 gnome-terminal 上收到这个乱码:
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)')
为什么?我怎样才能 "translate" 把它变成可读的(英文)形式?
感谢任何帮助或指点。
pyodbc 3.0.10 很旧。升级到最新版本(当前为 4.0.24)。它包括 this issue.
的修复更新:
你有mojibake的经典案例。 ppc64 默认为大端字节排序,但 Microsoft SQL 服务器(以及 FreeTDS)使用小端字节排序,因此从服务器返回的 UTF_16-encoded 消息被破坏:
>>> 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) to work around the mismatch in endian-ness, but your error is happening before the connection is established. You may want to raise an issue on GitHub。