0

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

"Data Dump" 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

108543 является то, что вы получаете, когда вы or вместе десятичные значения {1, 10, 100, 1000, 10000, 100000}.

Другими словами, они не рассматриваются как двоичные значения.

Вы либо должны сохранять правильные десятичные значения для двоичных эквивалентов, { 1, 2, 4, 8, 16, 32}, или найти способ преобразовать десятичные варианты держит только 0 и 1 цифры в соответствующее значение.

Если вы хотите сохранить строки, крепящие битовый шаблон, они могут быть преобразованы в десятичную с чем-то вроде:

conv(colname,2,10) 

который делает base conversion:

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

Я получил его :) Я дам вам правильный ответ. но я оставил ответ для следующего человека ниже :) Большое вам спасибо. Что я должен сделать тип столбца для авидного преобразования? – Jaylen

+0

@Mike, вы можете оставить его как есть, так как решение работает. Я бы, скорее всего, сохранил целочисленный тип, а не строку, поскольку операции будут иметь тенденцию быть быстрее, по крайней мере, с обычными базами данных. Так ли это для MySQL, я не знаю. Если это, как я помню, хранит все как строки в любом случае, разница может быть не такой. В любом случае, первая команда оптимизации - это «измерение, не угадай», а второе - «проверить свои полномочия, не доверяйте случайным блокам Интернета только потому, что они звучат хорошо» :-) – paxdiablo

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 
Смежные вопросы