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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章