Почему MySQL BIT_OR () возвращает другое значение, чем битовая операция PHP

У меня есть следующие данные в таблице MySQL

«Дамп данных» 2 phone_calls 001
2 звонка по телефону 010
2 звонка по телефону 100
2 phone_calls 1000
2 звонка по телефону 10000
2 звонка по телефону 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?

1

Решение

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'
3

Другие решения

Я понял 🙂

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
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector