在处理数据库中的十六进制值时,MySQL UNHEX和X之间的区别究竟是什么?UNHEX和X之间的区别(MySQL)
例如,
SELECT * FROM test WHERE guidCol IN (UNHEX('hexadecimalstring'));
SELECT * FROM test WHERE guidCol IN (X'hexadecimalstring');
两者都给出了确切的结果集。那么有什么区别?性能影响?
编辑:基础类型guidCol的是二进制的,当然
在处理数据库中的十六进制值时,MySQL UNHEX和X之间的区别究竟是什么?UNHEX和X之间的区别(MySQL)
例如,
SELECT * FROM test WHERE guidCol IN (UNHEX('hexadecimalstring'));
SELECT * FROM test WHERE guidCol IN (X'hexadecimalstring');
两者都给出了确切的结果集。那么有什么区别?性能影响?
编辑:基础类型guidCol的是二进制的,当然
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
不需要评估一个变量,因为它需要一个字符串。
请注意,即使在MySQL 5.6中,X'表示法在引用mysql客户端中具有长度限制,UNHEX()也不(看起来)。我不知道X的限制是什么,因为它没有正式记录,但是在尝试插入BLOB时遇到了它。使用X''字面值,mysql客户端用足够长的十六进制序列抛出语法错误,而同一序列的UNHEX()没有。显然,长度不是一个问题,当涉及到一个实际的GUID,但我认为这对于使用这个问题的其他人在一般情况下回答mysql二进制数据插入是非常有用的。
正确答案!谢谢.. – nawfal