【问题标题】:In SQL how do I get the maximum value for an integer?在 SQL 中,如何获得整数的最大值?
【发布时间】:2011-02-10 08:47:14
【问题描述】:

我正在尝试从 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

【问题讨论】:

  • 从表中重写它 (dev.mysql.com/doc/refman/5.0/en/numeric-types.html)。这不会以任何方式改变,您可以将其定义为 const。
  • 请注意,SIGNED 与 UNSIGNED 整数的值不同。
  • 嗨 CoffeeMonster。你看我的回答了吗?如果您认为它是正确的,请检查它。非常感谢,罗兰。
  • CoffeeMonster,我已经更新了我的答案。请看一看,看看你的想法。 TIA,罗兰

标签: sql mysql


【解决方案1】:

在 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)

【讨论】:

  • 这是锻炼 max(Big_Int) 的更好方法。我追求的是 max(Signed) 和 max(Unsigned)。
  • 如果 MySql 决定添加新版本会发生什么,比如说 HYPERINT(16 字节)?这会发现 mediumint、tinyint、smallint 吗?虽然我知道您可以通过 ~0 找到最大的 int 值,但我认为通过从最大值移位来寻找 smallint、mediumint、tinyint 并不是那么明智。
  • Kamil,虽然您在技术上是对的,但我开始回答时说这是一个“便宜的把戏”。 IOW,它解决了最初问题提出的问题,但不再假装是什么。但是,您不应该因为发布问题的解决方案而感到受阻。
  • 更好的方法是使用掩码,SELECT ~0 & 0xFFFFFFFF 表示 unsigned int。这种方式不依赖于~0的大小。
  • ~0 速记对于大值​​来说是聪明的,但这个解决方案是否没有抓住重点?如果您要硬编码每种类型的 的数量,为什么不简单地硬编码每种类型的?使用系统范围的常量(如果存在)的通常原因是它们允许您自动跟踪 MySQL 本身的结构变化。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多