以前咱們介紹過使用PHP腳本導出sql語句到測試服中的流程和注意點, 以前有個問題尚未解決的,就是mysql中blob類型數據是導不成功的。 此次找到了解決方法,這裏記錄一下。mysql
什麼是blob類型?git
咱們在【mysql經常使用數據類型中】介紹過了blob類型,這裏也說一下: 在MySQL中,Blob是一個二進制的對象,它是一個能夠存儲大量數據的容器(如圖片,音樂等等),且能容納不一樣大小的數據。 在MySQL中有四種Blob類型,他們的區別就是能夠容納的信息量不容分別是如下四種:sql
①TinyBlob類型 最大能容納255B的數據數據庫
②Blob類型 最大能容納65KB的json
③MediumBlob類型 最大能容納16MB的數據函數
④LongBlob類型 最大能容納4GB的數據測試
咱們的一個表有個字段的數據是存儲了一些會員信息,這些信息是由幾個字段組成,而後json_encode 而且壓縮後存儲在字段類型爲blob的字段中,這些信息以blob格式存儲在數據庫中,直接用sql查詢出來都是亂碼,沒法顯示,不信你能夠嘗試查詢下。ui
當咱們導出成sql語句時,若是不作特殊處理,這些字段也會是亂碼,會致使sql結構破壞掉,不能完整執行。this
解決方案 找了下資料,發現mysql有兩個函數,是能夠格式化這些二進制數據的。 下面是兩個函數的介紹spa
HEX 和UNHEX 建議先看一下官方免費手冊中的說明。
HEX(NorS)
If NorS is a number, returns a string representation of the hexadecimal value of N, where N is a longlong (BIGINT) number. This is equivalent to CONV(N,10,16).
翻譯:若是NorS是數字,則返回十六進制值N的字符串表示,其中N是longlong(BIGINT)數字。 這至關於CONV(N,10,16)。
If NorS is a string, returns a hexadecimal string representation of NorS where each character in NorS is converted to two hexadecimal digits. The inverse of this operation is performed by the UNHEX() function.
翻譯:若是NorS是字符串,則返回NorS的十六進制字符串表示形式,其中NorS中的每一個字符都轉換爲兩個十六進制數字。 此操做的反轉由UNHEX()函數執行。
mysql> SELECT HEX(255);
-> 'FF'
mysql> SELECT 0x616263;
-> 'abc'
mysql> SELECT HEX('abc');
-> 616263
UNHEX(str)
Performs the inverse operation of HEX(str). That is, it interprets each pair of hexadecimal digits in the argument as a number and converts it to the character represented by the number. The resulting characters are returned as a binary string.
翻譯:執行HEX(str)的逆操做。 也就是說,它將參數中的每對十六進制數字解釋爲數字,並將其轉換爲數字表示的字符。 結果字符做爲二進制字符串返回。
mysql> SELECT UNHEX('4D7953514C');
-> 'MySQL'
mysql> SELECT 0x4D7953514C;
-> 'MySQL'
mysql> SELECT UNHEX(HEX('string'));
-> 'string'
mysql> SELECT HEX(UNHEX('1267'));
-> '1267'
The characters in the argument string must be legal hexadecimal digits: '0' .. '9', 'A' .. 'F', 'a' .. 'f'. If UNHEX() encounters any nonhexadecimal digits in the argument, it returns NULL:
翻譯:參數字符串中的字符必須是合法的十六進制數字:'0'..'9','A'..'F','a'..'f'。 若是UNHEX()在參數中遇到任何非十六進制數字,則返回NULL:
mysql> SELECT UNHEX('GG');
+-------------+
| UNHEX('GG') |
+-------------+
| NULL |
+-------------+
A NULL result can occur if the argument to UNHEX() is a BINARY column, because values are padded with 0x00 bytes when stored but those bytes are not stripped on retrieval. For example 'aa' is stored into a CHAR(3) column as 'aa ' and retrieved as 'aa' (with the trailing pad space stripped), so UNHEX() for the column value returns 'A'. By contrast 'aa' is stored into a BINARY(3) column as 'aa\0' and retrieved as 'aa\0' (with the trailing pad 0x00 byte not stripped). '\0' is not a legal hexadecimal digit, so UNHEX() for the column value returns NULL.
翻譯:若是UNHEX()的參數是BINARY列,則可能會出現NULL結果,由於在存儲時會使用0x00字節填充值,但這些字節在檢索時不會被剝離。 例如,'aa'做爲'aa'存儲在CHAR(3)列中,並做爲'aa'檢索(尾隨填充空間被剝離),所以列值的UNHEX()返回'A'。 相比之下,'aa'做爲'aa \ 0'存儲在BINARY(3)列中,並做爲'aa \ 0'檢索(尾隨填充0x00字節未被剝離)。 '\ 0'不是合法的十六進制數字,所以列值的UNHEX()返回NULL。
綜上,簡單點理解就是
導出時採用HEX函數讀取數據,把二進制的數據轉爲16進制的字符串;
select HEX(binField) from testTable;
//查詢出來的數據是一串能夠展現的字符串,能夠導出爲sql語句,
//可是要恢復,要是用其逆轉函數UNHEX將數據格式化導入
//導入時採用UNHEX函數,把16進制的字符串轉爲二進制的數據導入庫中;
insert into testTable binField values(UNHEX(@hexstr));
//這樣格式化後,能夠完整的將數據導進去。