• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 位函数和运算符

    表位函数和运算符

    名称描述
    &按位与
    >>右移
    <<左移
    ^按位异或
    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中,位函数和运算符允许使用二进制字符串类型的参数(BINARYVARBINARYBLOB类型)并返回类似类型的值,这使它们能够采用参数并产生大于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'to 127,等等)执行数字转换。

      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地址的网络和主机部分之类的操作。(有关示例,请参阅本讨论的后面。)

    该计为二进制字符串参数包括列值,例程参数,局部变量和用户定义的变量具有一个二进制串类型:BINARYVARBINARY,或的一个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(literal AS 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 t VALUES (1, NULL);
    mysql> INSERT INTO t VALUES (1, NULL);
    mysql> INSERT INTO t VALUES (2, NULL);
    mysql> INSERT INTO t VALUES (2, X'1234');
    mysql> INSERT INTO t VALUES (2, X'FF34');
    mysql> SELECT HEX(BIT_AND(a)), HEX(BIT_OR(a)), HEX(BIT_XOR(a))
           FROM t GROUP 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'
      
    • >>

      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参数具有二进制字符串类型并且不是十六进制文字,位文字或NULL文字时,将进行二进制字符串求值。否则会进行数值求值,并根据需要将参数转换为无符号的64位整数。
      • 二进制字符串求值将生成与bit参数长度相同的二进制字符串。数值评估产生一个无符号的64位整数。

      有关更多信息,请参见本节中的介绍性讨论。

      mysql> SELECT 5 & ~1;
      -> 4
      mysql> SELECT HEX(~X'0000FFFF1111EEEE');
      -> 'FFFF0000EEEE1111'
      
    • 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