MySQL возвращает неправильные записи в побитовый SELECT

Может кто-нибудь предложить какое-либо понимание того, что здесь не так? Я использую поле 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, что это вызывает проблему, есть и другие значения.

1

Решение

Вы можете выполнять побитовые операции над целочисленными столбцами, но вам все равно нужно сохранять их как десятичные значения.

Хранить десятичное число 2 в хранилище целочисленных столбцов 2не 10, Вы можете использовать немного тип столбца вместо.

В любом случае, вы можете использовать b'value' запись значений, если вам проще.

INSERT INTO tablea (id, flag, approved)
VALUES (1, b'0', 'Y'), (2, b'1', 'Y'), (3, b'10', 'N')
1

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

Результат верный, например, 1000 — это 1111101000 в бинарном виде, если вы сравните его побитово с 256 (100000000), вы получите 256 (100000000), что верно. То же самое для 10000 (10011100010000) и 100000000 (101111101011110000100000000).

Поле флага должно иметь значение 0, 1, 2, 4, 8, 16, 32 и т. Д.

0

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