位值
位值文字使用或表示法书写。是使用零和一写入的二进制值。任何领先的大写字母都无所谓。标题区分大小写,不能写成。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 _utf8 0b1000001COLLATE utf8_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 tSET b = b'11111111'; mysql>INSERT INTO tSET b = b'1010'; mysql>INSERT INTO tSET 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位数。