Может кто-нибудь предложить какое-либо понимание того, что здесь не так? Я использую поле BIGINT (20) в таблице для хранения побитового значения (здесь есть и другие поля, но для простоты я проигнорировал их для SO), когда в этом поле выполняется оператор SELECT, он возвращает выбор записей для некоторых значений, выбор на месте, для других это неправильно.
Например:
TABLE A (there is a created_at timestamp field that isn't shown below)
id flag approved
1 0 Y
2 1 Y
3 10 N
4 100 Y
5 1000 Y
6 10000 Y
7 100000 Y
8 1000000 Y
9 10000000 Y
10 100000000 Y
11 1000000000 Y
Теперь, если я сделаю:
SELECT * from tableA where approved = 'Y' AND flag & 4 ORDER BY created_at DESC
Правильно возвращает только запись с ID 4. Все хорошо, никаких проблем. Однако, если я сделаю:
SELECT * from tableA where approved = 'Y' AND flag & 256 ORDER BY created_at DESC
Затем я получаю записи 5, 6 и 10 — когда я ожидал только запись 10! Это не мой код, потому что, если я запускаю тот же запрос в phpMyAdmin, я получаю те же ответы, но почему? Должно быть, я что-то не так делаю, но не вижу, что?
Мое понимание второго оператора SQL состоит в том, чтобы сказать, выберите все из таблицы A, где утверждено установлено в Y, и бит 256 в поле флага установлен.
Кто-нибудь может предложить какие-нибудь мысли? Это не только с флагом & 256, что это вызывает проблему, есть и другие значения.
Вы можете выполнять побитовые операции над целочисленными столбцами, но вам все равно нужно сохранять их как десятичные значения.
Хранить десятичное число 2 в хранилище целочисленных столбцов 2
не 10
, Вы можете использовать немного тип столбца вместо.
В любом случае, вы можете использовать b'value'
запись значений, если вам проще.
INSERT INTO tablea (id, flag, approved)
VALUES (1, b'0', 'Y'), (2, b'1', 'Y'), (3, b'10', 'N')
Результат верный, например, 1000 — это 1111101000 в бинарном виде, если вы сравните его побитово с 256 (100000000), вы получите 256 (100000000), что верно. То же самое для 10000 (10011100010000) и 100000000 (101111101011110000100000000).
Поле флага должно иметь значение 0, 1, 2, 4, 8, 16, 32 и т. Д.