在mysql中执行逐位xor+bit_count时出现问题



我正在尝试对哈希值(16个字符的十六进制字符串)进行比较。我有一个MYSQL表,它用phash VARCHAR(16)列存储这些值。这就是我要做的:

SELECT phash, bit_count(phash ^ x'dda15873a3de013d') FROM mytable;

但是bit_count+xor操作不正确。即使对于phash='dda15873a3de013d',我也会得到33,而我应该得到0(两个十六进制相同,因此xor应该只产生零,因此bit_count为0。

怎么了?谢谢

编辑:此处的示例=>http://sqlfiddle.com/#!9/d7f5c2/1/0

mysql> SELECT phash,BIT_COUNT(CONV(phash, 16, 10) ^ 0xdda15873a3de012d) from mytable limit 1;
+------------------+-----------------------------------------------------+
| phash            | BIT_COUNT(CONV(phash, 16, 10) ^ 0xdda15873a3de012d) |
+------------------+-----------------------------------------------------+
| dda15873a3de012d |                                                  33 |
+------------------+-----------------------------------------------------+

CONV返回一个字符串。您需要将CONV的结果强制转换为UNSIGNED

MySQL ^运算符仅适用于整数。它不能用于将字符串(或Blob)彼此异或。

如果您的字符串专门表示十六进制整数,则可以在将它们转换为整数后使用^

SELECT BIT_COUNT(CONV(phash, 16, 10) ^ 0xdda15873a3de013d)
SELECT BIT_COUNT(cast(CONV(phash, 16, 10) as unsigned) ^ 0xdda15873a3de013d)

最新更新