mysql实现数字>字母>中文>特殊字符排序

背景和目的

大产品就是有这么个需求,还是将name varchar(10) 的字符串按从左到右逐字进行大小匹配的,如:02,003,按从左到右匹配,就是 003需要排在02前面。

实现

mysql 正常的order by是按 ascii码 进行排序的,数字>字母>中文,这是正常排序,用order by就能实现;但特殊字符就比较特殊了,非字母数字中文就都是特殊字符;所以,需要做一通乱脑子的处理;

单字符匹配实现

示例:

select *, ( CASE WHEN HEX(pos) not regexp
'[46][1-9]|[357][0-9]|[46][a-f]|[57]a|e[4-9][0-9a-f]{4}' THEN pos  END
) AS sort from user order by sort, pos

解释1:匹配到非字母数字中文的内容,做sort排序,字母数字中文为null,排序优先级最高,排在上面;然后pos排序是用默认的 ascii排序;
解释2:为什么用 HEX()函数做十六进制编码?因为中文用常规的正则不能匹配到结果,起码我没匹配到结果;
解释3:为什么要把字母数字中文放在一起匹配?因为我机智啊,不然处理复杂度会更高;

多字符串实现

没有想到什么好的方法,只能是将 name varchar(10),先拆分为 10个单字符,然后再逐字进行匹配;

补充

数据量少的时候,可以参考下,数据量大了后,一定是结合三方进行功能实现的;至于怎么实现,我去找找其他大佬有没有漏下点什么的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值