1
我正在擴大在python內部的icinga插件,檢查Racktables數據庫(mysql utf8)中的SW到期時間。Python pyodbc奇怪的unicode字節碼
我正在運行的查詢返回SW的名稱和曆元中的到期日期,然後將它與實際日期+閾值進行比較。 此前,支票只是檢查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')]
我試圖字節碼轉換與編碼()和解碼()無濟於事。
我也嘗試了一些bytecodeconverter,但沒有人可以識別這種編碼。
我還檢查與再版()和類型()行[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問題,而不是編碼問題。任何對此的思考,歡迎
奇怪。你可以成對獲取代碼點並將其顛倒過來。你可以試試[MySQL連接器/ Python](https://dev.mysql.com/downloads/connector/python/),看看它是否更好? –
我已經用CentOS 6倉庫提供的古代mysql-connector-python 1.2.3成功地嘗試了相同的查詢,它工作得很好。 關於centos的pyodbc是v 2.1.7,也相當古老,所以它可能已在更新的版本中得到修復。 把它放在答案中,我可以接受它 – Bruno9779