[英]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正在返回
\\Unnnnnnnn
实体, \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.