11

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

例如。

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

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

两者都给了我确切的结果集。那么有什么区别吗?性能影响?

编辑: guidCol 的底层类型当然是二进制的

4

2 回答 2

16

UNHEX()一个函数,因此你可以做类似的事情

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

X另一方面,是十六进制字面量的语法。你不可以做这个:

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不需要评估变量,因为它需要一个文字字符串。

于 2012-06-24T10:13:34.437 回答
1

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

于 2017-01-31T22:01:45.637 回答