oracle的order by 中文排序原理
写SQL时,发现oracle的order by中文排序并不是完全按照拼音排序的
21鄞(yin)通集团PPN001 和 21舟山交投PPN002
这两个名称,按照拼音来说,应该Y在Z前面,百思不得其解!!!
但是,根据名称进行排序后发现,
21舟山交投PPN002 竟然在 21鄞(yin)通集团PPN001 前面。
经过测试发现oracle的order by中文排序是按照中文的ASCII码排序的
查询字符ASCII码
// 查询字符ASCII码
select ascii('鄞') from dual; --56244,
select ascii('舟') from dual; --55003
所以根据ASCII码排序,舟在鄞前面。貌似合情合理。
这里说一下oracle中的汉字分类:
一级汉字,是最常用的汉字,按汉语拼音字母顺序排列,共3755个;
二级汉字,属于次常用汉字,按偏旁部首的笔划顺序排列,共3008个
所以可能存在一些二级汉字的首字母是一级汉字的首字母之前的,会排序在一级汉字之后
正确排序方式:
// 1.按照拼音顺序
ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_PINYIN_M');
// 2.按照部首顺序
ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_RADICAL_M');
// 3.按照笔画顺序
ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_STROKE_M');
END