Mysql 位值字面量
跳到导航
跳到搜索
位值文字使用b’val’或0bval表示法编写。val是一个用零和一组成的二进制值。任何前导b的大小写都无关紧要。前导0b是大小写敏感的,不能写成0B。
合法的位值文字:
b'01' B'01' 0b01
不合法的位值文字:
b'2' (2不是二进制数字) 0B01 (0B必须写成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表示法也允许引入器。
在数值上下文中,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.0及更高版本中,位操作允许数值或二进制字符串参数。要显式为位文字指定二进制字符串上下文,请至少为其中一个参数使用_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数字不会显示在数值结果中。