У меня есть следующие данные в таблице 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?
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'
Я понял 🙂
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