MySQL 8.4 Release Notes
11.1.5 位值字面量
位值字面量使用b'
或val
'0b
记法。val
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
'0b
记法也允许引入符。关于引入符的信息,请参见第12.3.8节,“字符集引入符”。val
在数字上下文中,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.4 及更高版本允许位操作使用 numeric 或二进制字符串参数。要明确指定位字面量的二进制字符串上下文,可以在至少一个参数前添加 _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数字不在数值结果中显示。