UNHEX和X之间的区别(MySQL)

时间:2012-06-24 09:11:08

标签: mysql guid hex

在处理数据库中的十六进制值时,MySQL UNHEX和X之间的区别是什么?

EG。

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

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

两者都给了我精确的结果集。那有什么区别吗?绩效影响?

编辑: guidCol的基础类型当然是二进制

2 个答案:

答案 0 :(得分:14)

UNHEX()a function,因此您可以执行类似

的操作
SET @var = '41';
SELECT UNHEX(@var);
SELECT UNHEX(hex_column) FROM my_table;
另一方面,

Xhexadecimal litteral的语法。你不能这样做:

SET @var = '41';
SELECT X@var; -- 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不需要评估变量,因为它需要一个小字符串。

答案 1 :(得分:1)

请注意,即使在MySQL 5.6中,X''符号在引用mysql客户端中也有长度限制,UNHEX()没有(看起来如此)。我不知道X''的限制是什么,因为它没有正式记录,但我在尝试插入BLOB时遇到过它。使用X''文字,mysql客户端抛出了一个语法错误,其中包含足够长的十六进制序列,而相同序列的UNHEX()则没有。显然,当涉及到实际的GUID时,长度不是问题,但我认为这对于使用这个问题的其他人来说在一般情况下回答mysql插入二进制数据是有用的。