如何在MySQL数据库中存储版本号

18

我想在MySQL数据库中存储我的应用程序的版本号,例如:

version 1.1.0 1.1.1 1.1.2

我应该使用哪种数据类型?


3
你可以使用varchar - GautamD31
但是,如果将来我想对这些数据进行排序,那就不可能了。 - user3252359
为什么它不能排序呢?添加一个索引,它就可以很好地排序了。 - naththedeveloper
1
由于版本号总是从左边的主要版本号到右边的次要版本号排序,因此排序非常好。唯一的建议是将后缀(alpha、beta、RC等)和稳定标志存储在单独的字段中。 - ToBe
5个回答

22

您有两个选项:

  1. 使用 varchar

  2. 使用三个数字字段,Major,Minor,Patch

  3. 同时使用两者。

每个选项都有其优缺点。

选项1只有一个字段,所以很容易获取版本号。但它不一定是可排序的,因为2.0.0将按字典顺序高于10.0.0。

选项2将很容易排序,但您需要获取三个字段。

选项3可以使用视图来实现:

Table tversion (
  major NUMBER(3),
  minor NUMBER(3),
  patch NUMBER(3)
)

View vversion is 
  select major || '.' || minor || '.' || patch AS version,
         major * 1000000 + minor * 1000 + patch AS sortorder from tversion;

选项2是否容易排序?选择版本小于10.4.2的行的查询会是什么样子?因为该查询需要返回例如版本9.9.9。 - Jerome Jaglale
好的,这并不太复杂:(major = 10 and minor < 4 and patch < 2) or (major < 10)。但我觉得它应该更简单 :) - Jerome Jaglale
1
如果您添加了选项3建议的视图,则可以像这样操作:vversion.sortorder < 1004002 - Klas Lindbäck
好的,谢谢。我们可以直接将“优化”的版本号存储在表中,但我认为使用视图会更易于维护。 - Jerome Jaglale
@JeromeJaglale 那也是我的想法。 - Klas Lindbäck
对于未来的读者,比较版本的查询需要检查每个级别,例如:<10.4.2 应该转换为 (major < 10 OR (major = 10 AND (minor < 4 OR (minor = 4 AND patch < 2)))) - Walf

2

或者,为什么不直接使用数字呢?例如:

210061

这将是21.0.6 Beta 1。

这就是我做的方式。

但原则是要以一种使版本号段相乘的方式来结束,并存储表示您版本的整数表示。

这些数字自然会被排序。

在查看结果时,您可以将其分解为数字代表的内容。


1
你可以使用varchar()或者你甚至可以使用INET_NTOA。尝试这个链接

1
他不会将版本部分限制为仅1-255吗? - ToBe

1
我认为对于每个部分(major, minor, revision 和 build)使用整数列是最好的解决方案。但是在某些情况下,如果你必须使用一个 varchar 列,那么你可以这样做;
将版本数据格式化为 001.003.005.00079。
通过这种方式,比较和排序问题得到解决。

-3

在存储不同的版本号时,最好使用VARCHAR


2
如果你只想显示版本号,那么这样做是可以的。但如果你想按版本号排序,你需要找到另一个解决方案。 - Martin James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接