ITPub博客

首页 > 数据库 > Oracle > Oracle的order by中文排序

Oracle的order by中文排序

Oracle 作者:shelly_kuang 时间:2016-05-11 23:53:10 0 删除 编辑

在使用order by排序的时候,出现如下情况:

印象中中文排序应该默认是按照拼音排序的,为何“鑫”会排在“中”的后面呢?
猜想order by是不是根据对应字符的ASCII码排的呢,因此列出了对应的ASCII,如下:

由此基本可以断定,确实是通过ASCII的大小来排序的,
这也解释了为什么数字会排在字母之前,字母会排在汉字之前的现象。
但是为什么会出现汉字默认是通过拼音排序的错觉呢,于是查了一下汉字的编码规则,有提到如下一句:

    “一级汉字,是最常用的汉字,按汉语拼音字母顺序排列,共3755个;
       二级汉字,属于次常用汉字,按偏旁部首的笔划顺序排列,共3008个”

可知,如果排序的汉字都是一级汉字的话,确实是按照拼音顺序排列的,如果涉及到二级汉字,就不一定了。

    但是,如果就是要让汉字通过拼音顺序排序呢,可以通过如下方式:

  1. 按照拼音顺序  ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_PINYIN_M')
    按照部首顺序  ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_RADICAL_M')
    按照笔画顺序  ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_STROKE_M')

    配置NLS_SORT初始化参数,可以在数据库创建时指定,也可以通过alter session来修改.如果是前者,则在所有session中生效.例如:

    1. 使用select * from NLS_SESSION_PARAMETERS;语句可以看到NLS_SORT的值.
    2. 更改配置文件:alter system set nls_sort='SCHINESE_PINYIN_M' scope=spfile;
    3. 更改session:alter SESSION set NLS_SORT = SCHINESE_PINYIN_M;

    注意 : 性能问题,按oracle官方文档的解释,oracle在对中文列建立索引时,是按照2进制编码进行排序的,
    所以如果NLS_SORT被设置为BINARY时,排序则可以利用索引.如果不是2进制排序,
    而是
    使用上面介绍的3种针对中文的特殊排序,则oracle无法使用索引,会进行全表扫描.
    这点一定要注意,多用plsql工具比较一下执行效率.
    解决方法 : 在此列上建立linguistic index.例如:CREATE INDEX nls_index ON my_table (NLSSORT(name, 'NLS_SORT = SCHINESE_PINYIN_M'));


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29404710/viewspace-2098198/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: editable-datagrid.html
请登录后发表评论 登录
全部评论

注册时间:2015-01-16

  • 博文量
    23
  • 访问量
    49461