Spec-Zone.ru › MySQL 9.2

11.1.5 Литералы битовых значений

Литералы битовых значений записываются с использованием обозначения b'val' или 0bval. val — это двоичное значение, записанное с использованием нулей и единиц. Регистр заглавных букв ведущей b не имеет значения. Ведущая 0b регистрозависима и не может быть записана как 0B.

Допустимые литералы битовых значений:

b'01'
B'01'
0b01

Недопустимые литералы битовых значений:

b'2'    (2 is not a binary digit)
0B01    (0B must be written as 0b)

По умолчанию литерал битового значения — это двоичная строка:

mysql> SELECT b'1000001', CHARSET(b'1000001');
+------------+---------------------+
| b'1000001' | CHARSET(b'1000001') |
+------------+---------------------+
| A          | binary              |
+------------+---------------------+
mysql> SELECT 0b1100001, CHARSET(0b1100001);
+-----------+--------------------+
| 0b1100001 | CHARSET(0b1100001) |
+-----------+--------------------+
| a         | binary             |
+-----------+--------------------+

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

[_charset_name] b'val' [COLLATE collation_name]

Примеры:

SELECT _latin1 b'1000001';
SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;

В примерах используется обозначение b'val', но обозначение 0bval также допускает вводы. Сведения о вводах см. в разделе 12.3.8 «Вводы набора символов».

В числовых контекстах MySQL рассматривает битовую литерал как целое число. Для обеспечения числового обработки битовой литерал используйте её в числовом контексте. Способы выполнения этого включают добавление 0 или использование CAST(... AS UNSIGNED). Например, битовая литерал, присвоенная пользовательской переменной, по умолчанию является двоичной строкой. Чтобы присвоить значение как число, используйте его в числовом контексте:

mysql> SET @v1 = b'1100001';
mysql> SET @v2 = b'1100001'+0;
mysql> SET @v3 = CAST(b'1100001' AS UNSIGNED);
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| a    |   97 |   97 |
+------+------+------+

Пустое битовое значение (b'') оценивается как двоичная строка нулевой длины. Преобразованное в число, оно даёт 0:

mysql> SELECT CHARSET(b''), LENGTH(b'');
+--------------+-------------+
| CHARSET(b'') | LENGTH(b'') |
+--------------+-------------+
| binary       |           0 |
+--------------+-------------+
mysql> SELECT b''+0;
+-------+
| b''+0 |
+-------+
|     0 |
+-------+

Обозначение битового значения удобно для указания значений, которые нужно присвоить столбцам типа BIT:

mysql> CREATE TABLE t (b BIT(8));
mysql> INSERT INTO t SET b = b'11111111';
mysql> INSERT INTO t SET b = b'1010';
mysql> INSERT INTO t SET b = b'0101';

Битовые значения в наборах результатов возвращаются как двоичные значения, которые могут отображаться некорректно. Для преобразования битового значения в удобочитаемую форму используйте его в числовом контексте или используйте функцию преобразования, например, BIN() или HEX(). Цифры 0 старшего разряда не отображаются в преобразованном значении.

mysql> SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;
+------+----------+--------+--------+
| b+0  | BIN(b)   | OCT(b) | HEX(b) |
+------+----------+--------+--------+
|  255 | 11111111 | 377    | FF     |
|   10 | 1010     | 12     | A      |
|    5 | 101      | 5      | 5      |
+------+----------+--------+--------+

Для битовых литералов битовые операции считаются числовым контекстом, но битовые операции допускают числовые или двоичные строковые аргументы в MySQL 9.2 и более поздних версиях. Для явного указания двоичного строкового контекста для битовых литералов используйте ввод _binary хотя бы для одного из аргументов:

mysql> SET @v1 = b'000010101' | b'000101010';
mysql> SET @v2 = _binary b'000010101' | _binary b'000101010';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| 3F       | 003F     |
+----------+----------+

Отображаемый результат выглядит сходно для обеих битовых операций, но результат без _binary — это значение BIGINT, в то время как результат с _binary — это двоичная строка. Из-за различий в типах результатов отображаемые значения отличаются: Цифры 0 старшего разряда не отображаются для числового результата.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/bit-value-literals.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API