python - 为什么pyodbc在Fedora 27 ppc64上生成乱码错误信息?

标签 python python-3.x fedora pyodbc

我在 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-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)')

为什么?我怎样才能将其“翻译”成可读的(英文)形式?

感谢任何帮助或指点。

最佳答案

pyodbc 3.0.10 很旧。升级到最新版本(当前为 4.0.24)。它包括 this issue 的修复程序.

更新:

你有一个经典案例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关于您的具体情况。

关于python - 为什么pyodbc在Fedora 27 ppc64上生成乱码错误信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53038820/

相关文章:

python - 盈透证券自动交易

python-3.x - Anaconda 新环境在异步函数内给了我 python SyntaxError 'yield'

c++ - Fedora 中 boost 的使用

c++ - 如何在 Fedora 上安装 ImageMagick 开发库?

python - 修改函数输出并保存列表

python - ValueError : Shapes (16, ) 和 (1, 16) 在 tensorflow1.0 中不兼容

python - 为什么 (0>1 + 0>9) 返回 False,而 ((0>1) + (0>9)) 返回 0?

python - 属性错误 : module 'pandas' has no attribute 'read_csv' Python3. 5

linux - Yum 失败条件

python - 在 'href' 标签下提取 'a'