Тип данных Бит (Bit) в MySQL относится к числовым типам и обозначается как BIT(M), где M — число от 1 до 64. Если M не указано, его значение принимается равным единице. Если столбец с типом бит не может иметь значение NULL, то значение по умолчанию 0. Чтобы указать битовые значения, используется запись типа b’значение’. Например, b’110010111′ или b’1101′, 407 и 13. Чтобы получить эти числа, нужно воспользоваться записью битового значения + 0. Например, SELECT b'110010111'+0
. Если присваиваемое значение меньше, чем M бит в столбце, то значение дополняется слева нулями. Например, при присвоении величины b’110′ столбцу BIT(5), запишется битовое значение b’00110′.
Тип данных Бит и значения
Создадим таблицу table1 с единственным полем битового типа и заполним ее значениями (по аналогии с MySQL-документацией).
CREATE TABLE table1 (bitcolumn BIT(16));
INSERT INTO table1 SET bitcolumn = b'1111000011110000';
INSERT INTO table1 SET bitcolumn = b'11010';
INSERT INTO table1 SET bitcolumn = b'10000';
Просто выборка по полю SELECT bitcolumn FROM table1; не даст полезной информации, потому воспользуемся операцией прибавления ноля к выбираемому значению из поля; попробуем выбрать те же значения с использование функция приведения типа (BIN(), OCT(), HEX())
SELECT bitcolumn+0 FROM table1;
SELECT bitcolumn+0, BIN(bitcolumn+0), OCT(bitcolumn+0), HEX(bitcolumn+0)
FROM table1;
Результат будет как в таблице ниже
+-------------+------------------+------------------+------------------+
| bitcolumn+0 | BIN(bitcolumn+0) | OCT(bitcolumn+0) | HEX(bitcolumn+0) |
+-------------+------------------+------------------+------------------+
| 61680 | 1111000011110000 | 170360 | F0F0 |
| 26 | 11010 | 32 | 1A |
| 16 | 10000 | 20 | 10 |
+-------------+------------------+------------------+------------------+
3 rows in set (0.03 sec)
Тип данных Бит и функции
Битовое значение может быть присвоено пользовательской переменной как битовя строка. Для присвоения битового значения как числа, нужно использовать функцию CAST() или операцию +0.
SET @t1 = 0b11010;
SET @t3 = CAST(0b11010 AS UNSIGNED);
SET @t3 = CAST(0b11010 AS UNSIGNED);
SELECT @t1, @t2, @t3;
+------+------+------+
| @t1 | @t2 | @t3 |
+------+------+------+
| → | 26 | 26 |
+------+------+------+
BIT_COUNT()
— считает количество установленных битовBIT_AND()
,BIT_OR()
,BIT_XOR()
— битовые операции, которые могут использовать для группировки с предикатомGROUP BY
(по аналогии сCOUNT(*)
).
Например,
SELECT BIN(bitcolumn+0) FROM table1;
SELECT BIN(BIT_AND(bitcolumn)) FROM table1 UNION ALL
SELECT BIN(BIT_OR(bitcolumn)) FROM table1 UNION ALL
SELECT BIN(BIT_XOR(bitcolumn)) FROM table1;
Битовые операторы
& — побитовое И (пересечение)
| — побитовое ИЛИ (объединение)
^ — побитовое исключающее ИЛИ
<< — сдвиг влево
>> — сдвиг вправо
~ — побитовое отрицание
Создадим две битовые переменные и посмотрим на результат выполнения битовых операторов
SET @t1 = 0b1001+0;
SET @t2 = 0b1100+0;
SELECT @t1,@t2,@t1 & @t2 '&', @t1 | @t2 '|', @t1 ^ @t2 '^', @t1 << 1 '<< 1', @t1 >> 2 '>> 2' , ~@t1 '~';
+------+------+------+------+------+------+------+----------------------+
| @t1 | @t2 | & | | | ^ | << 1 | >> 2 | ~ |
+------+------+------+------+------+------+------+----------------------+
| 9 | 12 | 8 | 13 | 5 | 18 | 2 | 18446744073709551606 |
+------+------+------+------+------+------+------+----------------------+
Если заключать результаты в функцию BIN(), то увидим двоичное представление.
SET @t1 = 0b1001+0;
SET @t2 = 0b1100+0;
SELECT '@t1',BIN(@t1) UNION ALL
SELECT '@t2',BIN(@t2) UNION ALL
SELECT '&',BIN(@t1 & @t2) UNION ALL
SELECT '|',BIN(@t1 | @t2) UNION ALL
SELECT '^',BIN(@t1 ^ @t2) UNION ALL
SELECT '@t1 << 1',BIN(@t1 << 1) UNION ALL SELECT '@t1 > 2',BIN(@t1 >> 2) UNION ALL
SELECT '~', BIN(~@t1);
+----------+------------------------------------------------------------------+
| @t1 | BIN(@t1) |
+----------+------------------------------------------------------------------+
| @t1 | 1001 |
| @t2 | 1100 |
| & | 1000 |
| | | 1101 |
| ^ | 101 |
| @t1 << 1 | 10010 |
| @t1 >> 2 | 10 |
| ~ | 1111111111111111111111111111111111111111111111111111111111110110 |
+----------+------------------------------------------------------------------+