2015-12-03 65 views
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問題,而不是編碼問題。任何對此的思考,歡迎

+0

奇怪。你可以成對獲取代碼點並將其顛倒過來。你可以試試[MySQL連接器/ Python](https://dev.mysql.com/downloads/connector/python/),看看它是否更好? –

+0

我已經用CentOS 6倉庫提供的古代mysql-connector-python 1.2.3成功地嘗試了相同的查詢,它工作得很好。 關於centos的pyodbc是v 2.1.7,也相當古老,所以它可能已在更新的版本中得到修復。 把它放在答案中,我可以接受它 – Bruno9779

回答

0

一些奇怪的原因,pyodbc正在恢復

  • Unicode碼點對字符作爲單個\Unnnnnnnn實體,
  • 與內各反轉字符的順序
  • 與最後的'e'缺失,大概是因爲該字符串包含奇數個字符。
\U006f0043\U006d006d\U006e0075\U00670069\U00740061 
    o C  m m  n u  g i  t a 

在任何情況下,使用MySQL Connector/Python代替pyodbc和MySQL連接器/ ODBC似乎解決的問題。