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 似乎可以解决这个问题。
我正在 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 似乎可以解决这个问题。