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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,可以使用ORDER BY子句对字段进行字母排序。根据引用\[1\]的内容,如果字段的字符编码是utf8_general_ci,可以使用以下语句进行排序: SELECT * FROM table_name ORDER BY CONVERT(brand_name USING utf8) COLLATE utf8_general_ci; 如果字段的字符编码是latin1_swedish_ci,可以使用以下语句进行排序: SELECT * FROM table_name ORDER BY CONVERT(brand_name USING latin1) COLLATE latin1_swedish_ci; 根据引用\[2\]的内容,如果需要对类似于'A1-202001'的字段进行排序,可以使用自定义函数和MySQL内置函数来实现。首先,可以使用LEFT()函数将'A1'中的字母'A'提取出来,然后使用SUBSTRING_INDEX()函数将'A1'中的数字'1'提取出来。接下来,可以使用自定义函数来提取'A1'中的数字,然后使用获取的字母数字进行排序。 如果字段变成了'AB1-202001','BC1-202001'等类似的字段,可以使用LOCATE()函数来获取字母字符串中的位置,然后根据位置进行排序。 根据引用\[3\]的内容,如果想按照字段的首字母进行排序,可以将需要排序的字段转化为GBK编码,然后进行排序。可以使用CONVERT()函数来将字段转化为GBK编码,使用方式为CONVERT(字段 USING GBK)。 综上所述,根据具体的需求和字段的字符编码,可以选择合适的方法来进行MySQL字母排序。 #### 引用[.reference_title] - *1* [mysql 按字段的首字母排序及查询](https://blog.csdn.net/weixin_39830200/article/details/113138057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [mysql根据字母数字进行排序](https://blog.csdn.net/weixin_51255845/article/details/117421063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysql按照首字母排序](https://blog.csdn.net/weixin_46713508/article/details/125111012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值