2012-06-24 58 views
9

在處理數據庫中的十六進制值時,MySQL UNHEX和X之間的區別究竟是什麼?UNHEX和X之間的區別(MySQL)

例如,

SELECT * FROM test WHERE guidCol IN (UNHEX('hexadecimalstring')); 

SELECT * FROM test WHERE guidCol IN (X'hexadecimalstring'); 

兩者都給出了確切的結果集。那麼有什麼區別?性能影響?

編輯:基礎類型guidCol的是二進制的,當然

回答

13

UNHEX()a function,因此,你可以這樣做

SET @var = '41'; 
SELECT UNHEX(@var); 
SELECT UNHEX(hex_column) FROM my_table; 

X,在另一方面,是語法的hexadecimal litteral。你可以這樣做:

SET @var = '41'; 
SELECT [email protected]; -- error (string litteral expected) 
SELECT X'@var'; -- error (`@` is not a hexadecimal digit) 
SELECT X(@var); -- returns NULL, not too sure about the reason... [edit: but this is probably why you are inserting NULL values] 
SELECT X(hex_column) FROM my_table; -- returns NULL as well 

這就解釋了爲什麼你總是X獲得更好的性能:您使用的是語言結構而不是函數調用。 X不需要評估一個變量,因爲它需要一個字符串。

+0

正確答案!謝謝.. – nawfal

1

請注意,即使在MySQL 5.6中,X'表示法在引用mysql客戶端中具有長度限制,UNHEX()也不(看起來)。我不知道X的限制是什麼,因爲它沒有正式記錄,但是在嘗試插入BLOB時遇到了它。使用X''字面值,mysql客戶端用足夠長的十六進制序列拋出語法錯誤,而同一序列的UNHEX()沒有。顯然,長度不是一個問題,當涉及到一個實際的GUID,但我認爲這對於使用這個問題的其他人在一般情況下回答mysql二進制數據插入是非常有用的。