因为位运算可以在 MySQL 8.0 中原生处理二进制字符串参数,所以有些表达式在 MySQL 8.0 中产生的结果与在 5.7 中不同。要注意的五种有问题的表达式类型是:nonliteral_binary { & | ^ } binary
binary { & | ^ } nonliteral_binary
nonliteral_binary { << >> } anything
~ nonliteral_binary
AGGR_BIT_FUNC(nonliteral_binary)
这些表达式在 MySQL 5.7 中返回 BIGINT,在 8.0 中返回二进制字符串。● { op1 op2 ... }: 应用于给定表达式类型的运算符列表。● binary:任何类型的二进制字符串参数,包括十六进制字面量、位字面量或 NULL 字面量。● nonliteral_binary:除了十六进制字面量、位字面量或 NULL 字面量的二进制字符串值的参数。● AGGR_BIT_FUNC:接受位值参数的聚合函数:BIT_AND()、BIT_OR()、BIT_XOR()。结果类型取决于参数是作为二进制字符串计算还是作为数字计算:■ 当参数具有二进制字符串类型,且其中至少有一个不是十六进制字面值、位字面值或 NULL 字面值时,就会发生二进制字符串求值。数值计算则在其他情况下进行,必要时将参数转换为无符号64位整数。■ 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数长度不相等,则会出现 ER_INVALID_BITWISE_OPERANDS_SIZE 错误。数值计算产生一个无符号64位整数。mysql> SELECT 29 | 15;
-> 31
mysql> SELECT _binary X'40404040' | X'01020304';
-> 'ABCD'
如果从 mysql 客户端调用按位或,二进制字符串结果将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。结果类型取决于参数是作为二进制字符串计算还是作为数字计算:■ 当参数具有二进制字符串类型,且其中至少有一个不是十六进制字面值、位字面值或 NULL 字面值时,就会发生二进制字符串求值。否则进行数值计算,必要时将参数转换为无符号64位整数。■ 二进制字符串求值将生成与参数长度相同的二进制字符串。如果参数长度不相等,则会出现 ER_INVALID_BITWISE_OPERANDS_SIZE 错误。数值计算产生一个无符号64位整数。mysql> SELECT 29 & 15;
-> 13
mysql> SELECT HEX(_binary X'FF' & b'11110000');
-> 'F0'
如果从 mysql 客户端中调用按位与运算,二进制字符串结果将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。结果类型取决于参数是作为二进制字符串计算还是作为数字计算:■ 当参数具有二进制字符串类型,且其中至少有一个不是十六进制字面值、位字面值或 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'
如果从 mysql 客户端中调用按位异或运算,二进制字符串结果将使用十六进制显示,这取决于 --binary-as-hex 的值。结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 NULL 字面量时,就会进行二进制字符串求值。否则按照数值计算,必要时将参数转换为无符号64位整数。■ 二进制字符串求值将生成与位参数长度相同的二进制字符串。数值计算产生一个无符号64位整数。无论参数类型如何,值末尾移位的位都会丢失,没有警告。特别地,如果移位计数大于或等于位参数中的位数,则结果中的所有位都为0。mysql> SELECT 1 << 2;
-> 4
mysql> SELECT HEX(_binary X'00FF00FF00FF' << 8);
-> 'FF00FF00FF00'
如果从 mysql 客户端中调用位移位,则二进制字符串结果将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 NULL 字面量时,就会发生二进制字符串求值。否则进行数值计算,必要时将参数转换为无符号64位整数。■ 二进制字符串求值将生成与位参数长度相同的二进制字符串。数值计算产生一个无符号64位整数。无论参数类型如何,值末尾移位的位都会丢失,没有警告。特别地,如果移位计数大于或等于位参数中的位数,则结果中的所有位都为0。mysql> SELECT 4 >> 2;
-> 1
mysql> SELECT HEX(_binary X'00FF00FF00FF' >> 8);
-> '0000FF00FF00'
如果从 mysql 客户端调用位移运算,二进制字符串结果将使用十六进制表示法显示,这取决于 --binary-as-hex 的值。结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 NULL 字面量时,就会进行二进制字符串求值。否则进行数值计算,必要时将参数转换为无符号64位整数。■ 二进制字符串求值将生成与位参数长度相同的二进制字符串。数值计算产生一个无符号64位整数。mysql> SELECT 5 & ~1;
-> 4
mysql> SELECT HEX(~X'0000FFFF1111EEEE');
-> 'FFFF0000EEEE1111'
如果从 mysql 客户端中调用位取反,则二进制字符串结果将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。返回无符号64位整数参数 N 中二进制表示中设置为 1 的位数,如果参数为 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
https://dev.mysql.com/doc/refman/8.0/en/bit-functions.html