【问题标题】:SQL Data Type to store build versions用于存储构建版本的 SQL 数据类型
【发布时间】:2011-03-23 16:45:51
【问题描述】:

我应该为 SQL 列使用什么数据类型来存储产品版本,例如。

Version
0.1
0.1.1
0.2
1.1
1.1.647
2.0
.....

在查询中,我应该能够根据版本号对它们进行排序,并且我想要一个最佳查询来找到最高的数字。

谢谢

【问题讨论】:

标签: sql mysql database database-design


【解决方案1】:

您可能希望将版本存储在两个单独的列中。一个为VARCHAR,它将逐字存储版本值(以显示在UI中),一个为DECIMAL,用于排序。

如何将版本存储为可排序的 MySQL 中的 DECIMAL

假设一个版本的每个部分最多可以有4位,一个版本可以存储为:

"#{major}.#{format(minor)}#{format(revision)}"

其中format()函数定义为:

sprintf("%0.4d", i)[0,4]

这个值可以存储在DECIMAL(12,8) column中。

例如,版本 2021.7.115 将存储为 2021.00070115

如果版本的每个部分最多可包含 5 位数字 (sprintf("%0.5d", i)[0,5]),则上述格式需要 DECIMAL(15,10) column

例如,版本 2021.7.115 将存储为 2021.0000700115

为什么是 DECIMAL 而不是 INTEGER 数据类型?

DECIMAL 的优点是以后可以在右侧追加更多的数字而不影响排序,这对于INTEGER 列是不可能的。例如,{major}.{minor}{revision} 可以更改为 {major}.{minor}{revision}{morestuff} 而不会影响排序(如果不更新现有值,INTEGER 列是不可能的)。

PS:如何在 MySQL 中将版本存储为VARCHAR,这是可排序的

上面的技巧也可以用于将版本存储在字符串列中。

例如,格式

"#{format(major)}#{format(minor)}#{format(revision)}"

可以将版本值作为字符串存储在VARCHAR 列中。将版本存储在 VARCHAR 列中将需要比 DECIMAL 更多的存储空间,但如果版本值包含非数字字符,则可能是必需的。

例如,

  • 版本1.2.4 将存储为"000100020004"
  • 版本2021.7.115 将存储为"202100070115"

【讨论】:

    【解决方案2】:

    一个好的解决方案是使用一个整数来构建要存储的值,如下所示:

    MAJOR * 10000 + MINOR * 100 + Revision
    

    假设每个值的范围为 0..99。如果你想去 0..999 使用

    MAJOR * 1000000 + MINOR * 1000 + Revision
    

    这将正确排序,易于查询,紧凑(1 int 列),易于分解,甚至可以直观地分解。

    【讨论】:

    • 我已将这种方法用于 DynamoDB。成功了。
    【解决方案3】:

    存储在单独的数字字段中是个好主意。当其中一个部分达到 1000 时,作为字符串存储在单个字段中将中断排序。例如,1.2.999 将出现在(或显示为比)1.2.1000 之前(或显示为比)1.2.1000 之后。

    【讨论】:

      【解决方案4】:

      版本表中可能有三个或四个数字字段:

      Major, Minor, Revision, Build
      

      【讨论】:

        【解决方案5】:

        我会考虑将数字的每一部分存储在单独的 TINYINT/SMALLINT 字段中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-11
          • 2014-05-15
          • 1970-01-01
          • 2011-03-22
          • 2016-10-27
          • 2012-02-13
          • 2011-11-19
          • 2018-02-20
          相关资源
          最近更新 更多