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

Cof*_*ter 23 mysql sql

我试图从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
Run Code Online (Sandbox Code Playgroud)

提前致谢,

Rol*_*man 73

在Mysql中有一个廉价的技巧:

mysql> select ~0;
+----------------------+
| ~0                   |
+----------------------+
| 18446744073709551615 |
+----------------------+
Run Code Online (Sandbox Code Playgroud)

波浪号是按位否定.结果值很大.请参阅:http://dev.mysql.com/doc/refman/5.1/en/bit-functions.html#operator_bitwise-invert

对于其他整数风格,您可以使用正确的bitshift运算符,>>如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

  • 〜0速记对于一个很大的值很聪明,但是这个解决方案是否错过了这一点?如果您对每种类型的_bits_的数量进行硬编码,为什么不简单地为每种类型硬编码_value_?使用系统范围常量(如果存在)的常见原因是它们允许您自动跟踪MySQL本身的结构更改. (5认同)
  • 如果MySql决定添加新版本会发生什么,比方说,HYPERINT(16字节)?这会破坏找到mediumint,tinyint,smallint吗?虽然我知道你可以找到〜0的最大int值然后我认为寻找smallint,mediumint,tinyint通过从最大值位移位并不是那么明智. (3认同)
  • 卡米尔,虽然你在技术上是对的,但我的回答一开始就说这是一个“便宜的把戏”。IOW,它解决了最初问题提出的问题,但不再假装什么。但是,您不应该对发布问题的解决方案感到犹豫。 (2认同)
  • 更好的方法是使用掩码,`SELECT~0&0xFFFFFFFF`用于unsigned int.这样它不依赖于`~0`的大小. (2认同)