在SQL中,如何获取整数的最大值?

33
我试图从MySQL数据库中找出整数(带符号或无符号)的最大值。有没有一种方法可以从数据库本身获取此信息?
是否有任何内置常量或函数可供使用(标准SQL或特定于MySQL)。
http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html它列出了这些值 - 但是数据库能否告诉我呢?
以下代码给出了MAX_BIGINT - 我想要的是MAX_INT。
SELECT CAST( 99999999999999999999999 AS SIGNED ) as max_int;
# max_int | 9223372036854775807

重新编写它,可以从表格(http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html)中获取。这不会改变任何方式,你可以将其定义为常量。 - Svisstack
2
请注意,有符号整数和无符号整数的值是不同的。 - BryanH
嗨,CoffeeMonster。你看了我的答案吗?如果你认为它是正确的,请标记一下。非常感谢,罗兰。 - Roland Bouman
CoffeeMonster,我已经更新了我的答案,请看一下你觉得怎么样。TIA,Roland - Roland Bouman
2个回答

97

在Mysql中有一种便宜的技巧可以实现这个:

mysql> select ~0;
+----------------------+
| ~0                   |
+----------------------+
| 18446744073709551615 |
+----------------------+

波浪线(~)是位取反运算符。得到的值是一个大整数(bigint)。请参见:http://dev.mysql.com/doc/refman/5.1/en/bit-functions.html#operator_bitwise-invert

对于其他整数类型,可以使用右移位运算符>>,如下所示:

SELECT ~0 as max_bigint_unsigned
,      ~0 >> 32 as max_int_unsigned
,      ~0 >> 40 as max_mediumint_unsigned
,      ~0 >> 48 as max_smallint_unsigned
,      ~0 >> 56 as max_tinyint_unsigned
,      ~0 >> 1  as max_bigint_signed
,      ~0 >> 33 as max_int_signed
,      ~0 >> 41 as max_mediumint_signed
,      ~0 >> 49 as max_smallint_signed
,      ~0 >> 57 as max_tinyint_signed
\G

*************************** 1. row ***************************
   max_bigint_unsigned: 18446744073709551615
      max_int_unsigned: 4294967295
max_mediumint_unsigned: 16777215
 max_smallint_unsigned: 65535
  max_tinyint_unsigned: 255
     max_bigint_signed: 9223372036854775807
        max_int_signed: 2147483647
  max_mediumint_signed: 8388607
   max_smallint_signed: 32767
    max_tinyint_signed: 127
1 row in set (0.00 sec)

4
如果MySql决定在新版本中添加名为HYPERINT(16字节)的数据类型,会发生什么?这是否会影响查找mediumint、tinyint和smallint?虽然我知道可以通过~0找到最大的整数值,但是我认为从最大值进行位移以查找smallint、mediumint、tinyint并不明智。 - Kamil Dziedzic
3
卡米尔,虽然从技术角度来说你是正确的,但我在回答问题时已经说过这只是一个“便宜的伎俩”。换句话说,它解决了最初提出的问题,但并不打算做更多。然而,你不应该受到任何限制,可以发布你解决问题的方案。 - Roland Bouman
3
更好的方法是使用掩码,对于无符号整数可以使用 SELECT ~0 & 0xFFFFFFFF。这样就不会受到 ~0 大小的限制。 - Orvid King
8
使用 ~0 简写可以巧妙地表示一个大的值,但这个解决方案是否偏离了本意?如果你为每种类型硬编码位数,为什么不直接硬编码每种类型的实际值呢?通常使用系统范围内的常量(如果存在)是为了使你能够自动遵循 MySQL 本身的结构变化。 - Adamlive
1
“~0” 的速记法对于大值来说很聪明,但这种解决方案是否错过了重点呢?不是的 - 它正是原问题的正确解决方案。对于其他值,你可能有一些观点,但位移解决方案的优点在于它更紧凑,留下的笔误空间更少。但缺点是它有点晦涩难懂。 - Roland Bouman
显示剩余3条评论

-2

似乎没有任何内置常量可以提供这些值。 由于它们很可能不会改变,您可以安全地将它们硬编码或将其值设置为查找表或变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接