MySQL中的排序涉及到字符集和排序规则。默认情况下,MySQL按照ASCII码对字符进行排序,数字>字母>中文。但是,特殊字符(非字母、数字、中文)的排序需要一些额外处理。
试过SUBSTRING、LEFT等,都不能完美实现多中文的首字母排序
以下是实现不同类型字符排序的示例:
- 单字符匹配实现:
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 0ELSE 1END) AS sort
FROM user
ORDER BY sort, CONVERT(name USING bgk);
匹配到非字母数字中文的内容,做排序,字母数字中文为null,排序优先级最高,排在上面。
为什么用HEX()函数做十六进制编码?因为中文用常规的正则不能匹配到结果。
为什么要把字母数字中文放在一起匹配?因为处理复杂度会更高。
- 多字符串实现:
将name字段拆分为10个单字符,然后逐字进行匹配。
修改正则表达式,匹配多个字符:
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 0ELSE 1END) AS sort
FROM user
ORDER BY sort, CONVERT(name USING bgk);
这样可以处理更复杂的排序需求。