Python-pyodbc-unicode字节码
我正在用python扩展一个内部icinga插件,该插件检查Racktables DB(mysql utf8)中的软件过期情况 我正在运行的查询返回软件的名称和epoch中的过期日期,然后将其与实际日期+阈值进行比较。 以前的检查只是检查软件的到期日期,现在我需要它返回软件的名称 pyodbc中的查询返回int的正确值,但返回字符串的不可识别字节码。例如:Python-pyodbc-unicode字节码,python,mysql,unicode,pyodbc,Python,Mysql,Unicode,Pyodbc,我正在用python扩展一个内部icinga插件,该插件检查Racktables DB(mysql utf8)中的软件过期情况 我正在运行的查询返回软件的名称和epoch中的过期日期,然后将其与实际日期+阈值进行比较。 以前的检查只是检查软件的到期日期,现在我需要它返回软件的名称 pyodbc中的查询返回int的正确值,但返回字符串的不可识别字节码。例如: mysql> SELECT a.uint_value, b.name FROM AttributeValue a, Object b
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)
mysql>从AttributeValue a中选择a.uint_值,b.name,其中a.Object_id=b.id和a.attr_id=24,uint_值<(unix_时间戳(now())+40000000);
+------------+----------------------------+
|uint_值|转换(b.使用utf8的名称)|
+------------+----------------------------+
|1461974400 |通讯门|
+------------+----------------------------+
一行一组(0.00秒)
但在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')]
query=“从属性值a、对象b中选择a.uint\u值、b.name,其中a.Object\u id=b.id和a.attr\u id=24,uint\u值<(unix\u时间戳(now())+%d)”%wrange
con_string=''DRIVER=MySQL;服务器={0};端口={1};UID={2};PWD={3};数据库={4};选项=3''。格式(options.host、options.port、options.user、options.password、options.database)
con=pyodbc.connect(con_字符串)
cur=con.cursor()
当前执行(查询)
rows=cur.fetchall()
pprint行
[(1461974400,u'\U006f0043\U006d006d\U006e0075\U00670069\U00740061')]
我试着用encode()和decode()转换字节码,但没有用
我也尝试过一些字节码转换器,但没有人能识别这种编码
我还检查了repr()和type()行[0][1](字节码看起来可能是某种奇特的数据结构):
repr(行[0][1])
u'\U006f0043\U006d006d\U006e0075\U00670069\U00740061'
打印类型(行)
打印类型(行[0][1])
我现在倾向于认为这是一个pyodbc问题,而不是编码问题。任何关于这方面的想法都是受欢迎的出于某种奇怪的原因,pyodbc正在回归
- 字符对的Unicode代码点作为单个
实体\unnnnnnn
- 每对中的字符顺序颠倒,以及
- 缺少最后一个“e”,可能是因为字符串包含奇数个字符
\U006f0043\U006d006d\U006e0075\U00670069\U00740061
o C m n u g i t a
在任何情况下,使用而不是pyodbc和MySQL连接器/ODBC似乎可以解决这个问题。。您将获得成对的代码点并将其反转。你能试试看这是否更好吗?我用CentOS 6存储库提供的古老的mysql连接器python 1.2.3成功地进行了相同的查询,效果很好。centos上的pyodbc是v2.1.7,也很旧,所以在较新的版本中可能已经修复了它。把这个写在答案里,这样我就可以接受了
repr(rows[0][1])
u'\U006f0043\U006d006d\U006e0075\U00670069\U00740061'
print type(rows)
<type 'list'>
print type(rows[0][1])
<type 'unicode'>