MySQL 8.4 发行说明
位值字面量使用 b'
或 val
'0b
表示法编写。 val
val
是一个使用零和一编写的二进制值。任何前导 b
的大小写均可。前导 0b
区分大小写,不能写成 0B
。
合法的位值字面量
Press CTRL+C to copyb'01' B'01' 0b01
非法的位值字面量
Press CTRL+C to copyb'2' (2 is not a binary digit) 0B01 (0B must be written as 0b)
默认情况下,位值字面量是一个二进制字符串
Press CTRL+C to copymysql> SELECT b'1000001', CHARSET(b'1000001'); +------------+---------------------+ | b'1000001' | CHARSET(b'1000001') | +------------+---------------------+ | A | binary | +------------+---------------------+ mysql> SELECT 0b1100001, CHARSET(0b1100001); +-----------+--------------------+ | 0b1100001 | CHARSET(0b1100001) | +-----------+--------------------+ | a | binary | +-----------+--------------------+
位值字面量可以有一个可选的字符集介绍器和 COLLATE
子句,将其指定为使用特定字符集和排序规则的字符串
Press CTRL+C to copy[_charset_name] b'val' [COLLATE collation_name]
示例
Press CTRL+C to copySELECT _latin1 b'1000001'; SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;
这些示例使用 b'
表示法,但 val
'0b
表示法也允许使用介绍器。有关介绍器的更多信息,请参阅 第 12.3.8 节“字符集介绍器”。val
在数值上下文中,MySQL 将位字面量视为整数。要确保对位字面量进行数值处理,请在数值上下文中使用它。方法包括添加 0 或使用 CAST(... AS UNSIGNED)
。例如,默认情况下,分配给用户定义变量的位字面量是一个二进制字符串。要将该值作为数字分配,请在数值上下文中使用它
Press CTRL+C to copymysql> 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
Press CTRL+C to copymysql> SELECT CHARSET(b''), LENGTH(b''); +--------------+-------------+ | CHARSET(b'') | LENGTH(b'') | +--------------+-------------+ | binary | 0 | +--------------+-------------+ mysql> SELECT b''+0; +-------+ | b''+0 | +-------+ | 0 | +-------+
位值表示法便于指定要分配给 BIT
列的值
Press CTRL+C to copymysql> 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 位。
Press CTRL+C to copymysql> 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 及更高版本中使用数值或二进制字符串参数。要为位字面量显式指定二进制字符串上下文,请对其中至少一个参数使用 _binary
介绍器
Press CTRL+C to copymysql> 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 位。