【问题标题】:PyODBC outputting improper UTF-16PyODBC 输出不正确的 UTF-16
【发布时间】:2012-04-12 06:58:04
【问题描述】:

我正在尝试从 MySQL 数据库中提取表名列表。相关部分代码如下:

conn = pyodbc.connect('...')
cursor = conn.cursor()
for table in cursor.tables():
    print table.table_name

对于每张桌子,它都会打印一堆乱码(菱形中的方框和问号)。使用repr(table.table_name) 打印:

u'\U00500041\U004c0050\U00430049\U00540041\U004f0049'

对于名为“APPLICATION”的表。

如果将每个 32 位字符视为两个 16 位字符,则会得到字符串“PALPCTAOI”。交换字符对(1 和 2、3 和 4 等)会产生“APPLICATIO”(缺少“N”)。据推测,它交换了 N 和空字符,导致缺少 N(假设以空字符结尾的字符串)。

如何正确获取表名?

这是在 Python 2.4、PyODBC 2.1 和 MySQL 5.0.22 下运行的。

【问题讨论】:

  • 看起来像this bug。尝试使用更新版本的 PyODBC。
  • 我找不到更新的 32 位版本的 PyODBC for Linux (CENTOS 5.1),但我在这里找到了源代码 http://code.google.com/p/pyodbc/downloads/list。有谁知道我在哪里可以找到 PyODBC 的 32 位 RPM 的更高版本?
  • @Thomas K,我尝试将 CHARSET=UTF8 添加到我的连接字符串中,例如:cnxn = pyodbc.connect('DSN=localhost;CHARSET=UTF8'),这可以解决其中一个问题。感谢您的帮助!

标签: python mysql unicode pyodbc


【解决方案1】:

将 CHARSET=UTF8 添加到连接字符串有效,我现在启动并运行了应用程序。例如:

改变

cnxn = pyodbc.connect('DSN=localhost')

cnxn = pyodbc.connect('DSN=localhost;CHARSET=UTF8')

感谢 Thomas 为我指明了正确的方向。升级到更高版本的 PyODBC 也可以。

【讨论】:

    【解决方案2】:

    这是 pyodbc 2.1.8 中修复的已知问题:

    https://code.google.com/p/pyodbc/issues/detail?id=78&can=1&q=UTF-16

    不幸的是,对于 Ubuntu LTS 用户,Precise Pangolin 可用的版本是 2.1.7,这个问题仍然存在。如果你想坚持使用 LTS,我已经反向移植了 pyodbc 3.0.6 - 你可以在这里找到它:

    https://launchpad.net/~gazoakley/+archive/precise-backports

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 2014-06-22
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 2010-12-24
      • 2011-03-31
      • 2014-04-02
      • 1970-01-01
      相关资源
      最近更新 更多