2012-06-24 56 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二进制数据插入是非常有用的。

相关问题