1、版本号规则

# 以 . 分段,每段为0或大于0的数字
# 1.0.20
# 1.23.456.7890

2、正则

# 最后的{2}表示只能 3 段,即:x.y.z;{3}时则表示只能 4 段。
^((0)|([1-9][\d]*))((\.0)|(\.([1-9][\d]*))){2}$

3、SQL

# 示例,版本号:1.23.456
# 说明:版本号位数固定
## 将版本号分段截取,每段填充固定位数,合并填充后的字符串后比较
### SUBSTRING_INDEX(字段, 分割符,位数)
### SUBSTRING_INDEX('1.23.456', '.', 1),从左侧开始截取一位,值=1
### SUBSTRING_INDEX('1.23.456', '.', 2),从左侧开始截取两位,值=1.23
### SUBSTRING_INDEX('1.23.456', '.', -1),从右侧开始截取一位,值=456
### SUBSTRING_INDEX('1.23.456', '.', -2),从右侧开始截取两位,值=23.456

## 将每段左侧用同一值填充,以 0 示例
### LPAD(SUBSTRING_INDEX('1.23.456', '.', 1), 5,'0'),将第1段填充为5位的字符串,值=00001
### LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX('1.23.456', '.', 2), '.', -1) , 5,'0'),将第2段填充为5位的字符串,值=00023
### LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX('1.23.456', '.', 3), '.', -1) , 5,'0'),将第2段填充为5位的字符串,值=00456
SELECT
    `version`,
    SUBSTRING_INDEX(`version`, '.', 1) AS a,
    SUBSTRING_INDEX(SUBSTRING_INDEX(`version`, '.', 2), '.', -1) AS b,
    SUBSTRING_INDEX(SUBSTRING_INDEX(`version`, '.', 3), '.', -1) AS c,
    LPAD(SUBSTRING_INDEX(`version`, '.', 1), 5,'0') AS d,
    LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(`version`, '.', 2), '.', -1), 5, '0') AS e,
    LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(`version`, '.', 3), '.', -1), 5, '0') AS f,
    CONCAT(
        LPAD(SUBSTRING_INDEX(`version`, '.', 1), 5,'0'),
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(`version`, '.', 2), '.', -1), 5, '0'),
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(`version`, '.', 3), '.', -1), 5, '0')
    ) AS g
FROM `version` v
HAVING g > '000010002300456'
ORDER BY g DESC;