在处理数据库中的十六进制值时,MySQL UNHEX和X之间的区别是什么?
EG。
SELECT * FROM test WHERE guidCol IN (UNHEX('hexadecimalstring'));
SELECT * FROM test WHERE guidCol IN (X'hexadecimalstring');
两者都给了我精确的结果集。那有什么区别吗?绩效影响?
编辑: guidCol的基础类型当然是二进制
答案 0 :(得分:14)
UNHEX()
是a function,因此您可以执行类似
SET @var = '41';
SELECT UNHEX(@var);
SELECT UNHEX(hex_column) FROM my_table;
另一方面, X
是hexadecimal 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插入二进制数据是有用的。