Python中使用MySQL的BLOB字串型別

2021-04-15 09:20:57 字數 1506 閱讀 7085

一直想在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錯誤,因為不會對二進位制資料操作。

終於結束摸索了,總結一下:

welcome to picvew.com

在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 valu...

python中使用mysql詳細版

python操作mysql cursor物件 案例 京東商品查詢和新增 在python中要想使用mysql需要在python中匯入pymysql模組 sudo apt get install python3 pip3pip3 install pymysql在使用前需要先導入pymysql模組 fro...