繁体   English   中英

Python Pyodbc奇怪的Unicode字节码

[英]Python pyodbc weird unicode bytecode

我正在用python扩展内部的icinga插件,该插件可检查Racktables数据库(mysql utf8)中的SW到期。

我正在运行的查询以纪元形式返回软件的名称和到期日期,然后将其与实际日期+阈值进行比较。 以前,检查只是检查软件的到期日期,现在我也需要它返回软件的名称。

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

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()的字节码转换为无效。

我也尝试了一些bytecodeconverter,但是没有人可以识别这种编码。

我还检查了repr()和type()rows [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正在返回

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

无论如何,使用MySQL Connector / Python代替pyodbc和MySQL Connector / ODBC似乎可以解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM