暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的函数和运算符 - 位函数和运算符(4)

林员外聊编程 2021-07-24
305
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)
复制
 
这些表达式在 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 的值。
 
● <<
 
将一个 BIGINT 数或二进制字符串向左移位。
 
结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:
 
■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 NULL 字面量时,就会进行二进制字符串求值。否则按照数值计算,必要时将参数转换为无符号64位整数。
 
■ 二进制字符串求值将生成与位参数长度相同的二进制字符串。数值计算产生一个无符号64位整数。
 
无论参数类型如何,值末尾移位的位都会丢失,没有警告。特别地,如果移位计数大于或等于位参数中的位数,则结果中的所有位都为0
 
mysql> SELECT 1 << 2;
-> 4
mysql> SELECT HEX(_binary X'00FF00FF00FF' << 8);
-> 'FF00FF00FF00'
复制
 
如果从 mysql 客户端中调用位移位,则二进制字符串结果将使用十六进制表示法显示,具体取决于 --binary-as-hex 的值。
 
● >>
 
向右移动一个 BIGINT 数或二进制字符串。
 
结果类型取决于位参数是作为二进制字符串计算还是作为数字计算:
 
■ 当位参数具有二进制字符串类型且不是十六进制字面量、位字面量或 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 的值。
 
● BIT_COUNT(N)
 
返回无符号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
文章转载自林员外聊编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论