mysql实现数字、字母、中文、特殊字符排序 |
您所在的位置:网站首页 › 字母的顺序是怎么排的 › mysql实现数字、字母、中文、特殊字符排序 |
背景和目的 大产品就是有这么个需求,还是将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 |