php腳本l導出mysq的blob格式數據-hex和unhex的用法

前言

以前咱們介紹過使用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()函數執行。

  1. mysql> SELECT HEX(255);
  2. -> 'FF'
  3. mysql> SELECT 0x616263;
  4. -> 'abc'
  5. mysql> SELECT HEX('abc');
  6. -> 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)的逆操做。 也就是說,它將參數中的每對十六進制數字解釋爲數字,並將其轉換爲數字表示的字符。 結果字符做爲二進制字符串返回。

  1. mysql> SELECT UNHEX('4D7953514C');
  2. -> 'MySQL'
  3. mysql> SELECT 0x4D7953514C;
  4. -> 'MySQL'
  5. mysql> SELECT UNHEX(HEX('string'));
  6. -> 'string'
  7. mysql> SELECT HEX(UNHEX('1267'));
  8. -> '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:

  1. mysql> SELECT UNHEX('GG');
  2. +-------------+
  3. | UNHEX('GG') |
  4. +-------------+
  5. | NULL |
  6. +-------------+

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進制的字符串;

  1. select HEX(binField) from testTable;
  2. //查詢出來的數據是一串能夠展現的字符串,能夠導出爲sql語句,
  3. //可是要恢復,要是用其逆轉函數UNHEX將數據格式化導入

  1. //導入時採用UNHEX函數,把16進制的字符串轉爲二進制的數據導入庫中;
  2. insert into testTable binField values(UNHEX(@hexstr));
  3. //這樣格式化後,能夠完整的將數據導進去。
相關文章
相關標籤/搜索