Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-pyodbc-unicode字节码_Python_Mysql_Unicode_Pyodbc - Fatal编程技术网

Python-pyodbc-unicode字节码

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

我正在用python扩展一个内部icinga插件,该插件检查Racktables DB(mysql utf8)中的软件过期情况

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

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)
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'>