嘿伙计我正在使用此查询来获取使用自动增量的表的最大值
SELECT table_schema,
table_name,
data_type,
( CASE data_type
WHEN 'tinyint' THEN 255
WHEN 'smallint' THEN 65535
WHEN 'mediumint' THEN 16777215
WHEN 'int' THEN 4294967295
WHEN 'bigint' THEN 18446744073709551615
end >> IF(Locate('unsigned', column_type) > 0, 0, 1) ) AS MAX_VALUE
FROM information_schema.columns
WHERE table_schema NOT IN ( 'MYSQL', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA'
)
AND extra = 'auto_increment'"
我很难理解IF声明正在做什么。
end >> IF(Locate('unsigned', column_type) > 0, 0, 1) ) AS MAX_VALUE
任何想法??
答案 0 :(得分:1)
>>
运算符是按位右移。
例如,INT UNSIGNED
的最大值为4294967295,其中2 32 -1,或者基数2中的11111111111111111111111111111111。
但签名INT
使用其中一个位作为符号位,因此有符号整数的最大值为2147483647,其中2 31 -1或011111111111111111111111111111111 in base 2。
将11111111111111111111111111111111转换为011111111111111111111111111111111可以通过1位右移来完成。 32位字的最左位用零填充。
现在对于IF
:MySQL将数据类型命名为“int”或“int unsigned”。因此,如果字符串函数LOCATE()
找到“unsigned”字样,则最大值为4294967295的整个范围,因此将其位移0位。否则“unsigned”不会出现在数据类型名称中,并且int是有符号的,所以将它按位移位1位。
说明这一点的另一种方式:
INT UNSIGNED
= 4294967295 = 11111111111111111111111111111111 INT
= 2147483647 = 011111111111111111111111111111111 = 4294967295>> 1 强> 您可能也对我写的类似脚本感兴趣:https://github.com/billkarwin/bk-tools/blob/master/pk-full-ratio.sql
答案 1 :(得分:0)
双尖括号(大于符号)是二元移位算子。例如,如果列类型是无符号整数,它将移位1个位置(这基本上是数字的正方形),如果它是常规有符号整数,则它根本不会移位。有符号整数使用一位来指示是正数还是负数。无符号整数使用该位作为值的一部分,因此它可以保持更高的最大值,但根本不能保持负值。有意义吗?
答案 2 :(得分:0)
运行'Locate('unsigned',column_type)函数。这将检查字符串“unsigned”是否出现在名为“column_type”的列中。 'locate'函数将返回'unsigned'中第一个字母的字符偏移/位置(如果在'column_type'中找到)或零(0)(如果未找到)。测试该结果大于零'> 0' 。如果为TRUE,则返回下一个表达式,在上述情况下为零(0)。如果为FALSE,则返回最终表达式,为一(1)。
在其他语言中,可能会这样写:
if( Lotate('unsigned', column_type) > 0 ) {
return 0;
} else {
return 1;
}