Python pyodbc 奇怪的 unicode 字节码

Python pyodbc weird unicode bytecode

我正在 python 中扩展一个内部 icinga 插件,用于检查 Racktables DB (mysql utf8) 中的 SW 过期时间。

查询我是运行 returns SW的名称和epoch中的到期日期,然后将其与实际日期+阈值进行比较。 以前检查只会检查 SW 到期日期,现在我还需要 return 软件名称。

pyodbc 中的查询 returns int 的正确值,但 returns 无法识别字符串的字节码。示例:

mysql> SELECT a.uint_value, b.name FROM AttributeValue a, Object b WHERE a.object_id = b.id AND a.attr_id = 24 AND uint_value < (unix_timestamp(now())+40000000);
+------------+----------------------------+
| uint_value | CONVERT(b.name USING utf8) |
+------------+----------------------------+
| 1461974400 | Communigate                |
+------------+----------------------------+
1 row in set (0.00 sec)

但在 python:

query="SELECT a.uint_value, b.name FROM AttributeValue a, Object b WHERE a.object_id = b.id AND a.attr_id = 24 AND uint_value < (unix_timestamp(now())+%d)" % wrange

con_string = '''DRIVER=MySQL;SERVER={0};PORT={1};UID={2};PWD={3};DATABASE={4};OPTION=3''' . format(options.host,options.port,options.user,options.password,options.database)
con = pyodbc.connect(con_string)
cur = con.cursor()
cur.execute(query)
rows = cur.fetchall()
pprint rows
[(1461974400, u'\U006f0043\U006d006d\U006e0075\U00670069\U00740061')]

我曾尝试使用 encode() 和 decode() 转换该字节码​​,但无济于事。

我也试过一些字节码转换器,但是none可以识别这种编码。

我还检查了 repr() 和 type() 行[0][1](字节码看起来可能是某种奇特的数据结构):

repr(rows[0][1])
  u'\U006f0043\U006d006d\U006e0075\U00670069\U00740061'

print type(rows)
  <type 'list'>

print type(rows[0][1])
  <type 'unicode'>

我现在倾向于认为这是一个 pyodbc 问题而不是编码问题。欢迎对此有任何想法

出于某种奇怪的原因,pyodbc 正在返回

  • 作为单个 \Unnnnnnnn 实体的字符对的 Unicode 代码点,
  • 每对中的字符顺序颠倒,并且
  • 缺少最后的 'e',可能是因为该字符串包含奇数个字符。
\U006f0043\U006d006d\U006e0075\U00670069\U00740061
     o   C     m   m     n   u     g   i     t   a

无论如何,使用 MySQL Connector/Python 而不是 pyodbc 和 MySQL Connector/ODBC 似乎可以解决这个问题。