【发布时间】: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
我应该为 SQL 列使用什么数据类型来存储产品版本,例如。
Version
0.1
0.1.1
0.2
1.1
1.1.647
2.0
.....
在查询中,我应该能够根据版本号对它们进行排序,并且我想要一个最佳查询来找到最高的数字。
谢谢
【问题讨论】:
标签: sql mysql database database-design
您可能希望将版本存储在两个单独的列中。一个为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"。【讨论】:
一个好的解决方案是使用一个整数来构建要存储的值,如下所示:
MAJOR * 10000 + MINOR * 100 + Revision
假设每个值的范围为 0..99。如果你想去 0..999 使用
MAJOR * 1000000 + MINOR * 1000 + Revision
这将正确排序,易于查询,紧凑(1 int 列),易于分解,甚至可以直观地分解。
【讨论】:
存储在单独的数字字段中是个好主意。当其中一个部分达到 1000 时,作为字符串存储在单个字段中将中断排序。例如,1.2.999 将出现在(或显示为比)1.2.1000 之前(或显示为比)1.2.1000 之后。
【讨论】:
版本表中可能有三个或四个数字字段:
Major, Minor, Revision, Build
【讨论】:
我会考虑将数字的每一部分存储在单独的 TINYINT/SMALLINT 字段中。
【讨论】: