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

您所在的位置:网站首页 字母的顺序是怎么排的 mysql实现数字、字母、中文、特殊字符排序

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

2024-07-14 16:52| 来源: 网络整理| 查看: 265

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

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

单字符匹配实现 示例:

select name, ( case when hex(name) regexp'[46][1-9]|[357][0-9]|[46][a-f]|[57]a|e[4-9][0-9a-f]{4}' then 0 else 1 end ) as sort from user order by sort , convert(name using bgk);

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

多字符串实现 1、将 name varchar(10),先拆分为 10个单字符,然后再逐字进行匹配; 2、修改正则表达式,匹配多个字符:

select name, ( case when hex(name) regexp'^([46][1-9]|[357][0-9]|[46][a-f]|[57]a|e[4-9][0-9a-f]{4})+' then 0 else 1 end ) as sort from user order by sort , convert(name using bgk);

参考文献: 1、https://blog.csdn.net/weixin_43203551/article/details/90380234 20200526 2、https://blog.csdn.net/u012731379/article/details/64125572 20200526



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3