【问题标题】:PYODBC corrupts utf8 data (reading from MYSQL information_schema DB)PYODBC 损坏 utf8 数据(从 MYSQL information_schema DB 读取)
【发布时间】:2011-06-30 17:09:37
【问题描述】:

编辑: 我完全修改了这个问题,以反映我对问题的更好理解

用于获取数据库中所有表名的 PYODBC+MYSQL 命令

cursor.execute("select table_name from information_schema.tables where
             table_schema='mydbname'")

结果是一个 unicode 字符串列表,每个字符串中每第二个字符被省略

information_schema DB 是 utf8,虽然我的表名是纯 ascii。从我的 latin1 数据库中读取工作正常。执行set character_set_* = 'utf8' 没有帮助。

从 C++/ODBC 测试程序执行相同的查询工作正常。

你知道pyodbc 是如何处理字符编码的吗?使用 utf8 数据库时它采用什么编码?

我使用 UnixODBC、python 2.6.4、pyodbc 2.1.7 在 Linux 上工作

【问题讨论】:

  • 为什么你在本地 MySQL 数据库中使用 ODBC,而不是 MySQLdb 库?
  • @Daniel:这是一种“遗留”代码,我们刚刚从 DB2 切换到 mysql。我会看看这个库,它需要数据库是本地的吗?我不确定这将永远是这种情况
  • 不,它适用于远程数据库。我不知道它是否能解决你的问题,但至少会少一个系统。
  • 如果您在 Windows 上工作,您可以尝试使用来自 win32 扩展的odbc 模块(已包含在 ActiveState 发行版中)。
  • @Michal:谢谢,但我在 Linux 上工作......

标签: mysql unicode character-encoding odbc pyodbc


【解决方案1】:

ODBC 规范只允许两种编码:ASCII 和 UCS-2。 ODBC 驱动程序的工作是将数据库中的任何内容转换为这两者之一,但我发现大多数 ODBC 驱动程序作者不了解它应该如何工作。

执行查询时,pyodbc 不要求任何编码。它执行查询,然后向驱动程序询问每列的数据类型。如果数据类型是 Unicode,它将读取缓冲区并将其视为 UCS2。如果数据类型是ASCII,它会读取缓冲区并将其视为ASCII。

存储格式应该是无关紧要的。

【讨论】:

  • 谢谢!顺便说一句,我找到了使用cursor.execute("set character_set_results = 'latin1'") 的解决方法。不过,如果我这样做 cursor.tables(),这仍然无济于事。
猜你喜欢
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2013-10-29
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多