【问题标题】:Trouble doing a bitwise xor + bit_count in mysql在 mysql 中执行按位 xor + bit_count 时遇到问题
【发布时间】:2016-04-17 19:46:09
【问题描述】:

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

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

但是 bit_count + xor 没有正确完成。即使对于phash='dda15873a3de013d',我也会得到33,而我应该得到0(两个十六进制是相同的,所以异或应该只产生零,因此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 |
+------------------+-----------------------------------------------------+

【问题讨论】:

标签: mysql xor phash bitcount


【解决方案1】:

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

【讨论】:

  • 我遇到了完全相同的问题,CASTing CONV 的结果解决了它。
【解决方案2】:

MySQL ^ 运算符仅适用于整数。它不能用于将字符串(或 blob)相互异或。

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

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

【讨论】:

  • 不幸的是,我仍然得到 33 而不是 0。我已经编辑了我的问题以显示我得到的这个查询的结果(比 cmets 更具可读性)
【解决方案3】:
SELECT BIT_COUNT(cast(CONV(phash, 16, 10) as unsigned) ^ 0xdda15873a3de013d)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 2022-10-20
    • 2013-02-08
    • 1970-01-01
    • 2011-07-03
    • 2018-01-27
    • 2021-07-03
    • 2023-02-15
    相关资源
    最近更新 更多