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

在SQL中,如何获取整数的最大值?,sql,mysql,Sql,Mysql,我试图从MySQL数据库中找出整数(有符号或无符号)的最大值。有没有办法从数据库本身提取这些信息 是否有任何内置常量或函数可以使用(标准SQL或特定于MySQL的) 在它列出的值-但有没有一种方式让数据库告诉我 下面给出了MAX_-BIGINT-我想要的是MAX_-INT SELECT CAST( 99999999999999999999999 AS SIGNED ) as max_int; # max_int | 9223372036854775807 似乎没有任何内置常量来提供这些值。因为

我试图从MySQL数据库中找出整数(有符号或无符号)的最大值。有没有办法从数据库本身提取这些信息

是否有任何内置常量或函数可以使用(标准SQL或特定于MySQL的)

在它列出的值-但有没有一种方式让数据库告诉我

下面给出了MAX_-BIGINT-我想要的是MAX_-INT

SELECT CAST( 99999999999999999999999 AS SIGNED ) as max_int;
# max_int | 9223372036854775807

似乎没有任何内置常量来提供这些值。因为它们很可能不会更改,所以您应该安全地对它们进行硬编码,或者将它们的值设置为查找表或变量。

在Mysql中,有一个便宜的技巧可以做到这一点:

mysql> select ~0;
+----------------------+
| ~0                   |
+----------------------+
| 18446744073709551615 |
+----------------------+
波浪号是按位求反。结果值是一个bigint。见:

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

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)

从表()重写它。这不会以任何方式更改,您可以将其定义为const。请注意,对于带符号的v,您将有不同的值。未签名的ints。嗨,咖啡怪兽。你查过我的答案了吗?如果你认为是对的,请核对一下。非常感谢,罗兰。咖啡怪兽,我更新了我的答案。请看一看,看看你是怎么想的。蒂亚,罗兰这是一个更好的锻炼极限的方法。我想要的是max(有符号)和max(无符号)。如果MySql决定添加新版本,比如说HYPERINT(16字节),会发生什么?这会不会中断寻找mediumint,tinyint,smallint?虽然我知道你可以通过~0找到最大的int值,但我认为从最大值逐位寻找smallint、mediumint、tinyint并不是那么明智。Kamil,虽然你在技术上是对的,但我在开始回答时说这是一个“廉价的把戏”。瞧,它解决了最初的问题所带来的问题,但并不假装是其他问题。但是,您不应该在发布问题的解决方案时感到犹豫。更好的方法是使用掩码,
为无符号int选择~0&0xFFFFFFFF
。这样,它不依赖于
~0
的大小。~0速记对于大值来说很聪明,但这个解决方案是否没有抓住要点?如果要硬编码每种类型的位数,为什么不简单地硬编码每种类型的值呢?使用系统范围常量(如果存在)的通常原因是,它们允许您自动跟踪MySQL本身的结构更改。