昵稱排序順序要求
<ol>
<li>大小寫英文字母排序排在前面</li>
<li>中文按拼音排序</li>
<li>數(shù)字,符號以及emoji符號</li>
</ol>
實現(xiàn)思路 :
1.按照昵稱首字符的unicode 值進行排序鞋吉。(解決第一點需求)
根據(jù)unicode編碼對照表, 大小寫英文字母的范圍為 (十進制) 65 ~ 122商蕴,而數(shù)字以及常用標(biāo)點符號則在 (十進制)65以下。
所以需要處理的就只有65以下的編碼符號,將這些編碼的符號提升比中文要高的位置即可(這里只是考慮到昵稱只含有中文造壮,而不包含韓文覆履,日文其他語言的字符)。
2.MySql拼音排序方法
在MySql 里是通過gbk字符進行拼音排序的。
所以需要將排序的字段nickname 轉(zhuǎn)換成gbk進行排序硝全。
order by convert(nickname using gbk) asc 方法栖雾。
mysql 通常儲存格式為utf8 ,如果有emoji 標(biāo)簽符號數(shù)據(jù)伟众,則使用utf8mb4格式析藕。
(注:utf8最多只支持3個字節(jié),即3*8位,而emoji 長度最長會超過3個字節(jié),utf8mb4就是utf8 的超集, 擴展了utf8的可變長度 )
3.查詢gbk 拼音為z的最后一個漢字
根據(jù)gbk編碼范圍B0A1-F7FE,創(chuàng)建一張用于存儲所有g(shù)bk編碼漢字的表。編寫以下存儲過程實現(xiàn)上述操作:
<pre>
set @gbkStart = conv(hex(0xB0A1),16,10);
set @gbkEnd = conv(hex(0xF7FE),16,10);
set @i = @gbkStart;
drop table if exists t_gbk;
create table t_gbk(
charcode varchar(200),
charword varchar(10)
) charset gbk;
-- 插入gbk漢字
while @i<=@gbkEnd do
set @charcode = conv(@i,10,16);
set @charword = convert(unhex(@charcode) using gbk);
set @i = @i+1;
insert into t_gbk(charcode,charword) values(@charcode,@charword);
end while;
</pre>
查找最后一個拼音為Z的漢字: "糳" gbk編碼為 BC64
(注意這個gbk字符集所認可的 bc64 為"糳")
<pre>
select * from t_gbk order by charword desc
</pre>
SQL實現(xiàn):
<pre>
-- 拼音z排序最后的漢字:糳 utf8編碼為 \xe7\xb3\xb3(即0xe7b3b3),gbk編碼為BC64
-- 0x41 即十進制65 大寫字母A
select nickname,hex(left(nickname,1)) as raw_charcode,
convert(
unhex(
case
when hex(left(nickname,1))<hex(0x41) then hex(0xe7b3b3) -- 如果是少于英文字母編碼則轉(zhuǎn)換對應(yīng)的漢字 "糳"
when
left(nickname,1)>=0xf09f9880 -- 0xf09f9880 表示 emoji 表情??凳厢,utf8編碼為 \xf0\x9f\x98\x80 (即0xf09f9880)
then hex(0xe7b3b3) --將emoji表情轉(zhuǎn)換對應(yīng)的漢字 "糳"
ELSE hex(left(nickname,1))
end
)
using utf8)
as HanZi
from user
order by
convert(HanZi using gbk) asc, -- 這一步已經(jīng)能把emoji表情符號账胧,非中英文的符號排序到最后,
raw_charcode asc -- 由于emoji 是在原有漢字庫基礎(chǔ)上再出的,所以它的編碼值肯定比基礎(chǔ)編碼范圍要大先紫,這樣就可以把emoji排在最后
</pre>
** 注:0x41 即十進制65 大寫字母A **
<br ><br ><br >
參考:
查了一下漢字unicode 編碼,編碼為 16進制4E00 ~ 9FBF,
<strong>(注意是 Unicode編碼而不是utf8編碼)</strong>
具體編碼范圍可以從這里查詢:
http://wenku.baidu.com/link?url=r5dvL7MInjkYzO53qJRCO8V-i1REylaGfoU31QCoy53U3OeeEGl-uD3s1PaZJDuxwjX17H7bwS0sFDzt9N0boW0NQdbDetJK3HV32jgUkjq
或
http://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php
由于這里只考慮昵稱只含有中文,所以只需要將65以下的編碼符號提升大于最后中文的編碼(即9FBF)即可治泥。由于9FBF為unicode, 并且mysql 存儲的是utf8,所以需要把9FA5轉(zhuǎn)換成utf8編碼。最簡單的轉(zhuǎn)換方式:在上面鏈接里找到9FA5對應(yīng)的中文字,黏貼到文本里居夹,然后以utf8格式保存准脂,最后以16進制查看該文件的內(nèi)容。
也可以在python里將最后一個中文字轉(zhuǎn)換為utf8:
<pre>
s = u"\u9FBF";
s.encode("utf-8"); //輸出 '\xe9\xbe\xbf', 去掉\x前綴 即 e9bebf
</pre>
注: \u 表示unicode 編碼 , \x 表示utf-8 編碼
<br >