Опубликовано Оставить комментарий

Тип данных Бит в MySQL

Тип данных Бит в дельфиньей базе данных
Тип данных Бит в дельфиньей базе данных

Тип данных Бит (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 |
+----------+------------------------------------------------------------------+
Добавить комментарий