位函数和运算符
表位函数和运算符
名称 | 描述 |
---|---|
& | 按位与 |
>> | 右移 |
<< | 左移 |
^ | 按位异或 |
BIT_COUNT() | 返回设置的位数 |
| | 按位或 |
~ | 按位反转 |
位的函数和操作包括BIT_COUNT()
,BIT_AND()
,BIT_OR()
,BIT_XOR()
,&
,|
,^
,~
,<<
,和>>
。(该BIT_AND()
,BIT_OR()
和BIT_XOR()
聚集函数描述在第12.20.1,“集合(GROUP BY)函数描述”。)在此之前的MySQL 8.0,所需的比特的函数和操作BIGINT
(64位整数)的参数和返回的BIGINT
值,因此他们有最大范围为64位。在执行该操作之前,将非BIGINT
参数转换为BIGINT
,并且可能会发生截断。
在MySQL 8.0中,位函数和运算符允许使用二进制字符串类型的参数(BINARY
,VARBINARY
和BLOB
类型)并返回类似类型的值,这使它们能够采用参数并产生大于64位的返回值。BIGINT
与以前一样,将非二进制字符串参数转换为原始字符串并进行处理。
这种行为变化的暗示是,对二进制字符串参数的位操作在MySQL 8.0中可能会产生与5.7不同的结果。有关如何在MySQL 5.7准备为MySQL 5.7和8.0之间的潜在的不兼容信息,请参见位函数和操作符,在 MySQL的5.7参考手册。
- MySQL 8.0之前的位操作
- MySQL 8.0中的位操作
- 二进制字符串位操作示例
- 按位AND,OR和XOR运算
- 按位补码和移位运算
- BIT_COUNT()个操作
- BIT_AND(),BIT_OR()和BIT_XOR()操作
- 十六进制文字,位文字和NULL文字的特殊处理
- 与MySQL 5.7的位操作不兼容
MySQL 8.0之前的位操作
MySQL 8.0之前的位操作只能处理无符号的64位整数参数和结果值(即无符号BIGINT
值)。BIGINT
根据需要将其他类型的参数转换为。例子:
该语句对数字文字进行操作,将其视为无符号的64位整数:
mysql>
SELECT 127 | 128, 128 << 2, BIT_COUNT(15); +----------- +---------- +--------------- + | 127 | 128 | 128 << 2 | BIT_COUNT(15) | +----------- +---------- +--------------- + | 255 | 512 | 4 | +----------- +---------- +--------------- +在执行与第一个语句相同的操作并产生相同的结果之前,此语句对字符串参数(
'127'
to127
,等等)执行数字转换。mysql>
SELECT '127' | '128', '128' << 2, BIT_COUNT('15'); +--------------- +------------ +----------------- + | '127' | '128' | '128' << 2 | BIT_COUNT('15') | +--------------- +------------ +----------------- + | 255 | 512 | 4 | +--------------- +------------ +----------------- +该语句将十六进制文字用作位运算参数。默认情况下,MySQL将十六进制文字视为二进制字符串,但在数字上下文中会将它们视为数字(请参见“十六进制值”)。在MySQL 8.0之前,数字上下文包括位操作。例子:
mysql>
SELECT X'7F' | X'80', X'80' << 2, BIT_COUNT(X'0F'); +--------------- +------------ +------------------ + | X'7F' | X'80' | X'80' << 2 | BIT_COUNT(X'0F') | +--------------- +------------ +------------------ + | 255 | 512 | 4 | +--------------- +------------ +------------------ +位操作中对位值文字的处理类似于十六进制文字(即数字)。
MySQL 8.0中的位操作
MySQL 8.0扩展了位操作以直接(不进行转换)处理二进制字符串参数并产生二进制字符串结果。(不是整数或二进制字符串的参数仍像以前一样转换为整数。)此扩展通过以下方式增强了位操作:
- 大于64位的值可以进行位操作。
- 在更自然地表示为二进制字符串而不是整数的值上执行位运算更容易。
例如,考虑具有人类可读文本格式的UUID值和IPv6地址,如下所示:
UUID: 6ccd780c-baba-1026-9564-5b8c656024db IPv6: fe80::219:d1ff:fe91:1a72
对那些格式的文本字符串进行操作很麻烦。一种替代方法是将它们转换为不带分隔符的固定长度的二进制字符串。UUID_TO_BIN()
并INET6_ATON()
分别产生一个数据类型的值BINARY(16)
,即一个16字节(128位)长的二进制字符串。以下语句对此进行了说明(HEX()
用于产生可显示的值):
mysql>SELECT HEX(UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db')); +---------------------------------------------------------- + | HEX(UUID_TO_BIN('6ccd780c -baba -1026 -9564 -5b8c656024db')) | +---------------------------------------------------------- + | 6CCD780CBABA102695645B8C656024DB | +---------------------------------------------------------- + mysql>SELECT HEX(INET6_ATON('fe80::219:d1ff:fe91:1a72')); +--------------------------------------------- + | HEX(INET6_ATON('fe80::219:d1ff:fe91:1a72')) | +--------------------------------------------- + | FE800000000000000219D1FFFE911A72 | +--------------------------------------------- +
这些二进制值可通过位操作轻松地进行操作,以执行诸如从UUID值中提取时间戳或提取IPv6地址的网络和主机部分之类的操作。(有关示例,请参阅本讨论的后面。)
该计为二进制字符串参数包括列值,例程参数,局部变量和用户定义的变量具有一个二进制串类型:BINARY
,VARBINARY
,或的一个BLOB
类型。
十六进制文字和位文字呢?回想一下,在MySQL中,默认情况下它们是二进制字符串,但在数字上下文中是数字。在MySQL 8.0中如何处理位操作?MySQL是否像MySQL 8.0之前那样继续在数字上下文中评估它们?还是既然二进制字符串可以“本地”处理而无需转换,那么位操作是否将它们评估为二进制字符串?
答:通常使用十六进制文字或位文字来指定位操作的参数,以表示它们代表数字,因此,当所有位参数均为十六进制或位文字时,MySQL会继续在数字上下文中评估位操作,以实现向后兼容性。如果您需要以二进制字符串的形式来求值,则可以轻松实现:将_binary
引入程序用于至少一个文字。
这些位操作将十六进制文字和位文字评估为整数:
mysql>
SELECT X'40' | X'01', b'11110001' & b'01001111'; +--------------- +--------------------------- + | X'40' | X'01' | b'11110001' & b'01001111' | +--------------- +--------------------------- + | 65 | 65 | +--------------- +--------------------------- +由于
_binary
引入器的原因,这些位操作将十六进制文字和位文字评估为二进制字符串:mysql>
SELECT _binary X'40' | X'01', b'11110001' & _binary b'01001111'; +----------------------- +----------------------------------- + | _binary X'40' | X'01' | b'11110001' & _binary b'01001111' | +----------------------- +----------------------------------- + | A | A | +----------------------- +----------------------------------- +
尽管两个语句中的位运算都产生数值为65的结果,但是第二条语句在二进制字符串上下文中操作,其中65是ASCII A
。
在数值求值上下文中,十六进制文字和位文字参数的允许值最多为64位,结果也是如此。相比之下,在二进制字符串评估上下文中,允许的参数(和结果)可以超过64位:
mysql>SELECT _binary X'4040404040404040' | X'0102030405060708'; +--------------------------------------------------- + | _binary X'4040404040404040' | X'0102030405060708' | +--------------------------------------------------- + | ABCDEFGH | +--------------------------------------------------- +
有几种方法可以在位操作中引用十六进制文字或位文字来引起二进制字符串求值:
_binary literal BINARY literal CAST(literalAS BINARY)
产生十六进制文字或位文字的二进制字符串求值的另一种方法是将它们分配给用户定义的变量,这将导致变量具有二进制字符串类型:
mysql>SET @v1 = X'40', @v2 = X'01', @v3 = b'11110001', @v4 = b'01001111'; mysql>SELECT @v1 | @v2, @v3 & @v4; +----------- +----------- + | @v1 | @v2 | @v3 & @v4 | +----------- +----------- + | A | A | +----------- +----------- +
在二进制字符串上下文中,按位运算参数必须具有相同的长度,否则ER_INVALID_BITWISE_OPERANDS_SIZE
会发生错误:
mysql>SELECT _binary X'40' | X'0001'; ERROR 3513 (HY000): Binary operands of bitwise operators must be of equal length
为了满足等长要求,请在较短的值前加上零位前导数字;或者,如果较长的值以前导零位开头且可以接受较短的结果值,则将它们剥离:
mysql>SELECT _binary X'0040' | X'0001'; +--------------------------- + | _binary X'0040' | X'0001' | +--------------------------- + | A | +--------------------------- + mysql>SELECT _binary X'40' | X'01'; +----------------------- + | _binary X'40' | X'01' | +----------------------- + | A | +----------------------- +
填充或汽提也可以使用的功能,例如来实现LPAD()
,RPAD()
,SUBSTR()
,或CAST()
。在这种情况下,表达式参数不再是所有文字,并且_binary
变得不必要。例子:
mysql>SELECT LPAD(X'40', 2, X'00') | X'0001'; +--------------------------------- + | LPAD(X'40', 2, X'00') | X'0001' | +--------------------------------- + | A | +--------------------------------- + mysql>SELECT X'40' | SUBSTR(X'0001', 2, 1); +------------------------------- + | X'40' | SUBSTR(X'0001', 2, 1) | +------------------------------- + | A | +------------------------------- +
二进制字符串位操作示例
以下示例说明了使用位操作来提取UUID值的一部分(在这种情况下为时间戳和IEEE 802节点号)。该技术需要每个提取部分的位掩码。
将文本UUID转换为相应的16字节二进制值,以便可以在二进制字符串上下文中使用位操作来操纵它:
mysql>SET @uuid = UUID_TO_BIN('6ccd780c-baba-1026-9564-5b8c656024db'); mysql>SELECT HEX(@uuid); +---------------------------------- + | HEX(@uuid) | +---------------------------------- + | 6CCD780CBABA102695645B8C656024DB | +---------------------------------- +
为值的时间戳和节点编号部分构造位掩码。时间戳包括前三个部分(64位,位0到63),节点号是最后一部分(48位,位80到127):
mysql>SET @ts_mask = CAST(X'FFFFFFFFFFFFFFFF'AS BINARY(16)); mysql>SET @node_mask = CAST(X'FFFFFFFFFFFF'AS BINARY(16)) >> 80; mysql>SELECT HEX(@ts_mask); +---------------------------------- + | HEX(@ts_mask) | +---------------------------------- + | FFFFFFFFFFFFFFFF0000000000000000 | +---------------------------------- + mysql>SELECT HEX(@node_mask); +---------------------------------- + | HEX(@node_mask) | +---------------------------------- + | 00000000000000000000FFFFFFFFFFFF | +---------------------------------- +
在CAST(... AS BINARY(16))
这里使用该函数是因为这些掩码的长度必须与对其应用UUID值的长度相同。使用其他功能将蒙版填充到所需的长度,可以产生相同的结果:
SET @ts_mask= RPAD(X'FFFFFFFFFFFFFFFF' , 16, X'00');SET @node_mask = LPAD(X'FFFFFFFFFFFF', 16, X'00') ;
使用掩码提取时间戳和节点编号部分:
mysql>SELECT HEX(@uuid & @ts_mask)AS 'timestamp part'; +---------------------------------- + | timestamp part | +---------------------------------- + | 6CCD780CBABA10260000000000000000 | +---------------------------------- + mysql>SELECT HEX(@uuid & @node_mask)AS 'node part'; +---------------------------------- + | node part | +---------------------------------- + | 000000000000000000005B8C656024DB | +---------------------------------- +
前面的示例使用以下位操作:右移(>>
)和按位与(&
)。
注意
UUID_TO_BIN()
带有一个标志,该标志会导致生成的二进制UUID值发生一些位重新排列。如果使用该标志,请相应地修改提取掩码。
下一个示例使用位操作提取IPv6地址的网络和主机部分。假设网络部分的长度为80位。然后主机部分的长度为128-80 = 48位。要提取地址的网络和主机部分,请将其转换为二进制字符串,然后在二进制字符串上下文中使用位操作。
将文本IPv6地址转换为相应的二进制字符串:
mysql>SET @ip = INET6_ATON('fe80::219:d1ff:fe91:1a72');
以位为单位定义网络长度:
mysql>SET @net_len = 80;
通过左右移动全1地址来构造网络和主机掩码。为此,请从address开始::
,它是全零的简写,如将其转换为如下所示的二进制字符串所示:
mysql>SELECT HEX(INET6_ATON('::'))AS 'all zeros'; +---------------------------------- + | all zeros | +---------------------------------- + | 00000000000000000000000000000000 | +---------------------------------- +
要产生互补值(全为1),请使用~
运算符将这些位取反:
mysql>SELECT HEX(~INET6_ATON('::'))AS 'all ones'; +---------------------------------- + | all ones | +---------------------------------- + | FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF | +---------------------------------- +
向左或向右移动all-one值以生成网络和主机掩码:
mysql>SET @net_mask = ~INET6_ATON('::') << (128 - @net_len); mysql>SET @host_mask = ~INET6_ATON('::') >> @net_len;
显示掩码以验证它们是否覆盖了地址的正确部分:
mysql>SELECT INET6_NTOA(@net_mask)AS 'network mask'; +---------------------------- + | network mask | +---------------------------- + | ffff:ffff:ffff:ffff:ffff:: | +---------------------------- + mysql>SELECT INET6_NTOA(@host_mask)AS 'host mask'; +------------------------ + | host mask | +------------------------ + | ::ffff:255.255.255.255 | +------------------------ +
提取并显示地址的网络和主机部分:
mysql>SET @net_part = @ip & @net_mask; mysql>SET @host_part = @ip & @host_mask; mysql>SELECT INET6_NTOA(@net_part)AS 'network part'; +----------------- + | network part | +----------------- + | fe80::219:0:0:0 | +----------------- + mysql>SELECT INET6_NTOA(@host_part)AS 'host part'; +------------------ + | host part | +------------------ + | ::d1ff:fe91:1a72 | +------------------ +
前面的示例使用以下位操作:补码(~
),左移(<<
)和按位与(&
)。
剩余的讨论提供了有关每组位操作的参数处理的详细信息,有关位操作中的文字值处理的更多信息,以及MySQL 8.0与旧版MySQL之间的潜在不兼容性。
按位AND,OR和XOR运算
对于&
,|
和^
位操作,结果类型取决于将参数评估为二进制字符串还是数字:
- 当参数具有二进制字符串类型,并且其中至少一个不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数的长度不相等,
ER_INVALID_BITWISE_OPERANDS_SIZE
则会发生错误。数值评估产生一个无符号的64位整数。
数值评估的示例:
mysql>SELECT 64 | 1, X'40' | X'01'; +-------- +--------------- + | 64 | 1 | X'40' | X'01' | +-------- +--------------- + | 65 | 65 | +-------- +--------------- +
二进制字符串评估的示例:
mysql>SELECT _binary X'40' | X'01'; +----------------------- + | _binary X'40' | X'01' | +----------------------- + | A | +----------------------- + mysql>SET @var1 = X'40', @var2 = X'01'; mysql>SELECT @var1 | @var2; +--------------- + | @var1 | @var2 | +--------------- + | A | +--------------- +
按位补码和移位运算
对于~
,<<
和>>
位操作,结果类型取决于将bit参数评估为二进制字符串还是数字:
- 当bit参数具有二进制字符串类型并且不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与bit参数长度相同的二进制字符串。数值评估产生一个无符号的64位整数。
对于移位运算,无论自变量类型如何,从值末尾移位的位都将丢失而不会发出警告。特别是,如果移位计数大于或等于bit参数中的位数,则结果中的所有位均为0。
数值评估的示例:
mysql>SELECT ~0, 64 << 2, X'40' << 2; +---------------------- +--------- +------------ + | ~0 | 64 << 2 | X'40' << 2 | +---------------------- +--------- +------------ + | 18446744073709551615 | 256 | 256 | +---------------------- +--------- +------------ +
二进制字符串评估的示例:
mysql>SELECT HEX(_binary X'1111000022220000' >> 16); +---------------------------------------- + | HEX(_binary X'1111000022220000' >> 16) | +---------------------------------------- + | 0000111100002222 | +---------------------------------------- + mysql>SELECT HEX(_binary X'1111000022220000' << 16); +---------------------------------------- + | HEX(_binary X'1111000022220000' << 16) | +---------------------------------------- + | 0000222200000000 | +---------------------------------------- + mysql>SET @var1 = X'F0F0F0F0'; mysql>SELECT HEX(~@var1); +------------- + | HEX(~@var1) | +------------- + | 0F0F0F0F | +------------- +
BIT_COUNT()个操作
该BIT_COUNT()
函数始终返回无符号的64位整数,或者NULL
参数为NULL
。
mysql>SELECT BIT_COUNT(127); +---------------- + | BIT_COUNT(127) | +---------------- + | 7 | +---------------- + mysql>SELECT BIT_COUNT(b'010101'), BIT_COUNT(_binary b'010101'); +---------------------- +------------------------------ + | BIT_COUNT(b'010101') | BIT_COUNT(_binary b'010101') | +---------------------- +------------------------------ + | 3 | 3 | +---------------------- +------------------------------ +
BIT_AND(),BIT_OR()和BIT_XOR()操作
对于BIT_AND()
,BIT_OR()
和BIT_XOR()
位的功能,结果类型取决于该函数的参数值是否被评价为二进制字符串或数字:
- 当参数值具有二进制字符串类型并且参数不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值计算,并根据需要将参数值转换为无符号的64位整数。 - 二进制字符串求值将生成长度与参数值相同的二进制字符串。如果参数值的长度不相等,
ER_INVALID_BITWISE_OPERANDS_SIZE
则会发生错误。如果参数大小超过511个字节,ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE
则会发生错误。数值评估产生一个无符号的64位整数。
NULL
除非所有值均为,否则这些值不会影响结果NULL
。在这种情况下,结果是具有相同的长度参数的值(所有的位为1的长度的中性值BIT_AND()
,所有的位为0 BIT_OR()
,和BIT_XOR()
)。
例:
mysql>CREATE TABLE t (group_id INT, a VARBINARY(6)); mysql>INSERT INTO tVALUES (1, NULL); mysql>INSERT INTO tVALUES (1, NULL); mysql>INSERT INTO tVALUES (2, NULL); mysql>INSERT INTO tVALUES (2, X'1234'); mysql>INSERT INTO tVALUES (2, X'FF34'); mysql>SELECT HEX(BIT_AND(a)), HEX(BIT_OR(a)), HEX(BIT_XOR(a))FROM tGROUP BY group_id; +----------------- +---------------- +----------------- + | HEX(BIT_AND(a)) | HEX(BIT_OR(a)) | HEX(BIT_XOR(a)) | +----------------- +---------------- +----------------- + | FFFFFFFFFFFF | 000000000000 | 000000000000 | | 1234 | FF34 | ED00 | +----------------- +---------------- +----------------- +
十六进制文字,位文字和NULL文字的特殊处理
为了向后兼容,当所有位参数均为十六进制文字,位文字或NULL
文字时,MySQL 8.0在数字上下文中评估位操作。也就是说,如果所有位参数都是未经修饰的十六进制文字,位文字或NULL
文字,则对二进制字符串位参数的位操作将不使用二进制字符串求值。(如果这些文字是使用_binary
介绍人,BINARY
运算符或其他将其明确指定为二进制字符串的方式编写的,则不适用于这些文字。)
刚刚描述的文字处理与MySQL 8.0之前的相同。例子:
这些位操作在数字上下文中评估文字并产生
BIGINT
结果:b'0001' | b'0010' X'0008' << 8
这些位运算
NULL
在数字上下文中求值,并产生BIGINT
具有NULL
值的结果:NULL & NULL NULL >> 4
在MySQL 8.0中,您可以通过明确指出至少一个参数是二进制字符串来使这些操作在二进制字符串上下文中求值:
_binary b'0001' | b'0010' _binary X'0008' << 8 BINARY NULL & NULL BINARY NULL >> 4
最后两个表达式的结果是NULL
,就像没有BINARY
运算符一样,但是结果的数据类型是二进制字符串类型,而不是整数类型。
与MySQL 5.7的位操作不兼容
因为位操作可以在MySQL 8.0中本地处理二进制字符串参数,所以某些表达式在MySQL 8.0中产生的结果与在5.7中不同。需要注意的五种有问题的表达式类型是:
nonliteral_binary { & | ^ } binary binary { & | ^ } nonliteral_binary nonliteral_binary { << >> } anything ~ nonliteral_binary AGGR_BIT_FUNC(nonliteral_binary)
这些表达式BIGINT
在MySQL 5.7中返回,在8.0中返回二进制字符串。
符号说明:
{op1op2...}
:适用于给定表达式类型的运算符列表。binary
:任何类型的二进制字符串参数,包括十六进制文字,位文字或NULL
文字。nonliteral_binary
:参数是二进制字符串值,而不是十六进制文字,位文字或NULL
文字。AGGR_BIT_FUNC
:一个聚集函数,它位值参数:BIT_AND()
,BIT_OR()
,BIT_XOR()
。
有关如何在MySQL 5.7准备为MySQL 5.7和8.0之间的潜在的不兼容信息,请参见位函数和操作符,在 MySQL的5.7参考手册。
下表描述了可用的位函数和运算符:
|
按位或。
结果类型取决于将参数评估为二进制字符串还是数字:
- 当参数具有二进制字符串类型,并且其中至少一个不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数的长度不相等,
ER_INVALID_BITWISE_OPERANDS_SIZE
则会发生错误。数值评估产生一个无符号的64位整数。
有关更多信息,请参见本节中的介绍性讨论。
mysql>
SELECT 29 | 15; -> 31 mysql>SELECT _binary X'40404040' | X'01020304'; -> 'ABCD'- 当参数具有二进制字符串类型,并且其中至少一个不是十六进制文字,位文字或
&
按位与。
结果类型取决于将参数评估为二进制字符串还是数字:
- 当参数具有二进制字符串类型,并且其中至少一个不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数的长度不相等,
ER_INVALID_BITWISE_OPERANDS_SIZE
则会发生错误。数值评估产生一个无符号的64位整数。
有关更多信息,请参见本节中的介绍性讨论。
mysql>
SELECT 29 & 15; -> 13 mysql>SELECT HEX(_binary X'FF' & b'11110000'); -> 'F0'- 当参数具有二进制字符串类型,并且其中至少一个不是十六进制文字,位文字或
^
按位XOR。
结果类型取决于将参数评估为二进制字符串还是数字:
- 当参数具有二进制字符串类型,并且其中至少一个不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数的长度不相等,
ER_INVALID_BITWISE_OPERANDS_SIZE
则会发生错误。数值评估产生一个无符号的64位整数。
有关更多信息,请参见本节中的介绍性讨论。
mysql>
SELECT 1 ^ 1; -> 0 mysql>SELECT 1 ^ 0; -> 1 mysql>SELECT 11 ^ 3; -> 8 mysql>SELECT HEX(_binary X'FEDC' ^ X'1111'); -> 'EFCD'- 当参数具有二进制字符串类型,并且其中至少一个不是十六进制文字,位文字或
<<
将longlong(
BIGINT
)数字或二进制字符串左移。结果类型取决于将bit参数评估为二进制字符串还是数字:
- 当bit参数具有二进制字符串类型并且不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与bit参数长度相同的二进制字符串。数值评估产生一个无符号的64位整数。
不管参数类型如何,从值末尾移出的位都将丢失而不会发出警告。特别是,如果移位计数大于或等于bit参数中的位数,则结果中的所有位均为0。
有关更多信息,请参见本节中的介绍性讨论。
mysql>
SELECT 1 << 2; -> 4 mysql>SELECT HEX(_binary X'00FF00FF00FF' << 8); -> 'FF00FF00FF00'- 当bit参数具有二进制字符串类型并且不是十六进制文字,位文字或
>>
BIGINT
向右移动longlong()数字或二进制字符串。结果类型取决于将bit参数评估为二进制字符串还是数字:
- 当bit参数具有二进制字符串类型并且不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与bit参数长度相同的二进制字符串。数值评估产生一个无符号的64位整数。
不管参数类型如何,从值末尾移出的位都将丢失而不会发出警告。特别是,如果移位计数大于或等于bit参数中的位数,则结果中的所有位均为0。
有关更多信息,请参见本节中的介绍性讨论。
mysql>
SELECT 4 >> 2; -> 1 mysql>SELECT HEX(_binary X'00FF00FF00FF' >> 8); -> '0000FF00FF00'- 当bit参数具有二进制字符串类型并且不是十六进制文字,位文字或
~
反转所有位。
结果类型取决于将bit参数评估为二进制字符串还是数字:
- 当bit参数具有二进制字符串类型并且不是十六进制文字,位文字或
NULL
文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。 - 二进制字符串求值将生成与bit参数长度相同的二进制字符串。数值评估产生一个无符号的64位整数。
有关更多信息,请参见本节中的介绍性讨论。
mysql>
SELECT 5 & ~1; -> 4 mysql>SELECT HEX(~X'0000FFFF1111EEEE'); -> 'FFFF0000EEEE1111'- 当bit参数具有二进制字符串类型并且不是十六进制文字,位文字或
BIT_COUNT(N)
返回参数中设置
N
为无符号64位整数的位数,或者NULL
如果参数为NULL
。mysql>
SELECT BIT_COUNT(64), BIT_COUNT(BINARY 64); -> 1, 7 mysql>SELECT BIT_COUNT('64'), BIT_COUNT(_binary '64'); -> 1, 7 mysql>SELECT BIT_COUNT(X'40'), BIT_COUNT(_binary X'40'); -> 1, 1