mysql查询varchar类型字段,内容有中文+数字组合时候排序按照ascall值导致xxx18排起来比xxx5要小的问题
业务需要,查询时候按照设备名称排序,直接排序发现会出现问题:

很明显,终端10不应该出现在终端2前面,这个是因为排序是一个一个位往后移去比较大小的,移到第三位时候终端10是“1”,终端2是“2”,所以会判断终端10比较小,这显然不符合业务需求,
于是上网查了一下,一开始想用内置函数配合正则把数字提取出来,但是mysql库是5.7没有这些函数,有一些是通过截取得到数字转换类型比较的,那样的话只适合固定格式的,
最后找到可以利用LENGTH方法来分组,LENGTH获取当前字段内容长度:
SELECT dev_name ,LPAD( dev_name,3, '0' ) FROM common_device_info where fac_id='e5fa2b9f-fd15-4cb1-9639-4c2f6b1d8c0b' ORDER BY LENGTH( dev_name ),dev_name

最后也就实现了需求,LPAD是填充格式化,也是过程中为了实现排序搜到的,可以设置第二个参数很大很大,格式化之后长度相同再来排序,但是长度要写死,感觉总归是不太好,还是通过长度和设备名称同时排序普适性比较高一些。

浙公网安备 33010602011771号