一直想在mysql中直接儲存二進位制資料,嘗試到今天也沒有解決這個問題,但仍有幾點要記錄一下,比較亂:
可惜設定不了0編號,就將就著在這裡寫下版本吧。python 2.4.4,mysqldb 1.2.1_p2,mysql 5.0.32
不 要使用''%r'',比如''insert into mytbl values (%r)'',這樣做就很沒意思了,讀取乙個二進檔案內容到data,然後再使用file.write(''%r'' % data)寫入到檔案,開啟看以下你就會明白。使用''%r''還不如使用base64編碼。
mysqldb.escape_string對二進位制資料使用沒有問題,escape後的資料只增大了一點。據說新的版本下這個可以省略。
使用''insert into mytbl values (%s)'' % mysqldb.escape_string(data)應該是對的,但會提示unicodedecodeerror。
第4點中的錯誤,懷疑是資料庫的charset關係,我的db的character_set_name()返回"latin1";也有可能是組織sql命令字串時就出現的問題。
python codebook, page 355, chapter 8.7 storing a blob in a mysql database,有時間仔細看看。
使用mysql的load_file
函式是跳過以上問題的好方法,看開始時我總是得到null,折騰了半天發現要使用這個函式需要得到file許可權,這個許可權必須設定給全域性(又折騰了一會),(using on *.* syntax)。詳細可以參見mysql的grant語法
。grant file on *.* to
you@localhost
identified by "secret";
使用load_file得到的結果正是我所需要的,如果第4步成功,也應該是這樣。
更 正:第5點中的錯誤是從cursors.py的146行產生的:query = query.encode(charset)。帶二進位制的mysql命令字串是可以產生的,但對它使用execute就會有這樣的問題。mysql中倒是 有binary的charset型別,但python中沒有,所以不能在建立資料庫時指定charset為binary。mysql字符集相關資料可以參 見這裡
。 萬般無奈之下我決定抄下python codebook, chapter 8.7.2的**來執行,竟然沒遇到折磨我的encode錯誤,再把程式中的二進位制資料換成我測試用的資料,還是正常。仔細看下,原來我用execute的方式不一樣:
cursor.execute(query % binary_data)
而codebook裡是這樣寫的:
cursor.execute(query, binary_data)
看看"/usr/lib/python2.4/site-packages/mysqldb/cursors.py"中的execute,就知道區別在那裡了,codebook的**當然沒有encode錯誤,因為不會對二進位制資料操作。
終於結束摸索了,總結一下:
org:
在Python中使用MYSQL
緣由 近期在折騰乙個小東西須要抓取網上的頁面。然後進行解析。將結果放到 資料庫中。了解到python在這方面有優勢,便選用之。由於我有臺 server上面安裝有 mysql,自然使用之。在進行資料庫的這個操作過程中遇到了不少問題,這裡 記錄一下,大家共勉。python中mysql的呼叫 之後能夠通過...
Python中使用MySQL的BLOB字串型別
一直想在mysql中直接儲存二進位制資料,嘗試到今天也沒有解決這個問題,但仍有幾點要記錄一下,比較亂 可惜設定不了0編號,就將就著在這裡寫下版本吧。python 2.4.4,mysqldb 1.2.1 p2,mysql 5.0.32 不要使用 r 比如 insert into mytbl value...
python中使用mysql詳細版
python操作mysql cursor物件 案例 京東商品查詢和新增 在python中要想使用mysql需要在python中匯入pymysql模組 sudo apt get install python3 pip3pip3 install pymysql在使用前需要先導入pymysql模組 fro...