为什么MySQL BIT_OR()返回的值不同于PHP按位操作

时间:2014-12-03 01:22:39

标签: php mysql bit-manipulation aggregate-functions bitwise-operators

我在MySQL表中有以下数据

“数据转储”     2 phone_calls 001     2 phone_calls 010     2 phone_calls 100     2 phone_calls 1000     2 phone_calls 10000     2 phone_calls 100000

如果我运行PHP代码来执行按位或像这样的操作

echo bindec('001') | bindec('010') | bindec('100') | bindec('1000') | bindec('10000') | bindec('100000');

我得到63输出“这是预期的”

如果我这样做或手动

000001
000010
000100
001000
010000
100000
======
111111

the result = 111111 which is `32 + 16 + 8 + 4 + 2 + 1 = 63`

当我在MySQL中运行以下查询时

SELECT user_id, section_name, BIT_OR(permission_type) AS final
FROM permissions
WHERE section_name ='phone_calls' and user_id = 2
GROUP BY user_id, section_name

基本上是在上面列出的“数据转储”上运行BIT_OR(),输出是

 2  phone_calls 108543

为什么MySQL给了我108543而PHP给了我63?我怎样才能让MySQL给我63?

2 个答案:

答案 0 :(得分:3)

108543or加上十进制{1, 10, 100, 1000, 10000, 100000}时的结果。

换句话说,它们并未被视为二进制值。

您需要为二进制等值项{ 1, 2, 4, 8, 16, 32}存储正确的十进制值,或者找到将仅保留01位的十进制变量转换为适当值的方法。

如果要保留包含位模式的字符串,可以将它们转换为十进制,例如:

conv(colname,2,10)

执行base conversion

mysql> select conv('10',2,10);
    -> '2'
mysql> select conv('1000',2,10);
    -> '8'

答案 1 :(得分:0)

我明白了:)

SELECT user_id, section_name, BIT_OR(CONV(permission_type, 2, 10)) AS final
FROM data_import.permissions
WHERE section_name ='phone_calls' and user_id = 2
GROUP BY user_id, section_name