我在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?
答案 0 :(得分:3)
108543
是or
加上十进制值{1, 10, 100, 1000, 10000, 100000}
时的结果。
换句话说,它们并未被视为二进制值。
您需要为二进制等值项{ 1, 2, 4, 8, 16, 32}
存储正确的十进制值,或者找到将仅保留0
和1
位的十进制变量转换为适当值的方法。
如果要保留包含位模式的字符串,可以将它们转换为十进制,例如:
conv(colname,2,10)
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