mysql中比较版本字符串

文章目录

  1. 1. 获取版本范围
  2. 2. 获取版本顺序

业务背景:
获取小于等于当前版本的最新版本数据

发现在mysql中比较版本字符串有个坑:
select "5.1.3">"5.1.24"
结果会是1,因为是按位比较,3比2大。。。。

怎么解决呢,stackoverflow上种方法:
传送门

条件设定:版本格式为 x.x.x (只有三组版本号,或组数确定)

获取版本范围

取每组版本号并向前补0至N位(比方5位、10位),最后拼接好在进行比较

1
2
3
4
5
6
7
8
-- 获取小于等于12.0.2版本的最新数据
SELECT *, CONCAT(
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', 1), '.', -1), 5, '0'),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', 2), '.', -1), 5, '0'),
LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(version, '.', 3), '.', -1), 5, '0')) vcode
FROM foo
having vcode <= CONCAT(LPAD(12,5,'0'), LPAD(0,5,'0'), LPAD(2,5,'0'))
order by vcode desc;

sqlfiddle测试地址


获取版本顺序

如果只是排序,且版本号都是数字,可以采用每组版本号转数字,在排序

1
2
3
4
5
6
SELECT Version
FROM foo
order by
SUBSTRING_INDEX( `version` , '.', 1 )*1,
SUBSTRING_INDEX(SUBSTRING_INDEX( `version` , '.', 2 ),'.',-1)*1,
SUBSTRING_INDEX( `version` , '.', -1 )*1

sqlfiddle测试地址

如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2017/12/08/mysql-compare-version-string.html