Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Bit-Value Literals

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 8.3 及更高版本中。要明确指定二进制字符串上下文为位字面量,使用 _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 数字在数字结果中不显示。