在MySQL中对大位字符串执行按位运算?

时间:2011-11-29 03:00:57

标签: mysql string bit-manipulation xor hamming-distance

我有一个带有大量2048位二进制字符串的MySQL数据库(例如'0111001 ... 0101')。我需要的一个计算是这些字符串的汉明距离(在XOR'd结果中的总计数为1)与一些外部生成的位串相比较。为了了解如何编写此查询,我尝试将其编写为较小的位串。这是一个例子:

select BIT_COUNT(bin((b'0011100000') ^ (b'1111111111')))

计算XOR的内部部分正常工作,但BIT_COUNT返回奇怪的结果。此示例返回14,它比字符串本身长。

所以我有几个问题:

首先,为什么BIT_COUNT会返回如此奇怪的结果。它是在字符串上运行而不是我希望它操作的二进制字符串吗?如果是这样,我该如何处理?

其次,请注意我正在通过前缀b来投射(这是正确的词吗?)字符串为二进制。我如何使用列名和变量执行此操作?显然,我不能简单地将b添加到变量名称,并且我不能在它们之间插入空格。有什么想法吗?

谢谢,

编辑: 所以这是第一个问题的解决方案:

select BIT_COUNT(b'0011100000' ^ b'1111111111')

将其用于较大的字符串(2048位)时似乎存在问题。我试过了:

select BIT_COUNT(b'001110...00011')

它给我的结果如28,当实际的bitcount应该在1024左右。如果我删除b,那么它似乎最大值为64.有关如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

只需删除bin功能即可。使用它BIN_COUNT将其参数视为字符串,而不是一组位。所以

select BIT_COUNT(b'0011100000' ^ b'1111111111')

将完成工作