http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#i1008198

引用

Oracle provides the following types of sorts:

Binary sort

Monolingual linguistic sort

Multilingual linguistic sort

注:后两种可统一为linguistic(语言的) sort

关于NLS:National Language Support

Setting NLS Parameters:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch3globenv.htm#NLSPG003

查看数据库NLS相关信息:

select * from nls_database_parameters;

查看当前会话NLS相关信息:

select * from nls_session_parameters;

关于Oracle汉字order by:

http://www.kods.net/common-statement-oracle/

引用

37. Chinese is how to sort?

Prior to Oracle9i, the Chinese are in accordance with the sort of binary encoding.

Added in oracle9i in accordance with pinyin, radical, stroke order functions. Set NLS_SORT value

SCHINESE_RADICAL_M in accordance with the radical (first order), stroke (second order) Sort

SCHINESE_STROKE_M in accordance with the stroke (first order), radicals (second order) Sort

SCHINESE_PINYIN_M sorted according to Pinyin

汉字排序须综合考虑数据库字符集、NLS_SORT。

查看版本信息:

select * from v$version;

查看数据库字符集:

SELECT userenv('language') FROM dual;

如果字符集为ZHS16GBK/ZH16GBK,那么使用order by默认是按照汉字的拼音顺序进行排序的;如果为其他(如UTF8),那么汉字的排序是按照BINARY排序的。

数据库字符集不为中文字符集的情况下怎样让其按照汉字拼音排序?答案是设置NLS_SORT。

NLS_SORT specifies the collating sequence for ORDER BY queries

查看NLS_SORT:

引用

查看整个数据库的:select value from nls_database_parameters where parameter='NLS_SORT';

查看当前会话的:select value from nls_session_parameters where parameter='NLS_SORT';

字符集为中文字符集、NLS_SORT为BINARY时,汉字是按汉字拼音排序;

字符集为非中文字符集(如UTF8)、NLS_SORT为BINARY时,汉字按二进制编码(BINARY)排序。

所以,对非中文字符集库:

一 可通过设置其NLS_SORT来实现汉字的定制化排序;改变当前会话的NLS_SORT:

ALTER session SET NLS_SORT = SCHINESE_PINYIN_M

上述语句只可改变当前session的NLS_SORT;执行"ALTER system SET NLS_SORT = SCHINESE_PINYIN_M"欲改变整个数据库的NLS_SORT,提示"ORA-02096: 此选项的指定初始化参数不可修改",为什么?因为该参数无法在数据库启动的情况下动态修改:

http://www.unix-center.net/bbs/viewthread.php?tid=13853

http://kr.forums.oracle.com/forums/thread.jspa?threadID=211579

到底怎么修改整个数据库的NLS_SORT那?有待继续考证(参照这个帖子做考证:http://forums.oracle.com/forums/thread.jspa?threadID=917930)

二 也可在查询时指定NLS_SORT:

引用

1、使用拼音排序

select * from t order by nlssort(field,'NLS_SORT=SCHINESE_PINYIN_M');

2、使用笔画排序

select * from t order by nlssort(field,'NLS_SORT=SCHINESE_STROKE_M');

3、使用偏旁部首排序

select * from t order by nlssort(field,'NLS_SORT=SCHINESE_RADICAL_M');总:

http://www.kods.net/oracle-database-scheduling-problem-by-the-chinese-alphabet-nls-sort-set/

引用

Prior to Oracle9i, the Chinese is based on binary coding to sort. The oracle9i added in accordance with the phonetic, radical, stroke sorting.

1, set parameter values NLS_SORT

SCHINESE_RADICAL_M accordance with the radical (first order), stroke (second order) to sort

SCHINESE_STROKE_M accordance with the stroke (first order), radical (second order) to sort

SCHINESE_PINYIN_M sorted according to Pinyin

2, Session-level settings, modify the default ORACLE field Sort by:

According to Pinyin: alter session set nls_sort = SCHINESE_PINYIN_M;

According to stroke: alter session set nls_sort = SCHINESE_STROKE_M;

According to the radical: alter session set nls_sort = NLS_SORT = SCHINESE_RADICAL_M;

3, the statement level is set Sort by:

Oracle according to alphabetical order

Select * From [tablename] order By nlssort (colname, 'NLS_SORT = SCHINESE_STROKE_M');

Oracle accordance with the radical sort

Select * From [tablename] order By nlssort (colname, 'NLS_SORT = SCHINESE_RADICAL_M');

Oracle sorted according to Pinyin

Select * From [tablename] order By nlssort (colname, 'NLS_SORT = SCHINESE_PINYIN_M');

4, modify the system parameters (database where the operating system):

set NLS_SORT = SCHINESE_RADICAL_M; export NLS_SORT (sh)

setenv NLS_SORT SCHINESE_RADICAL_M (csh)

HKLC \ SOFTWARE \ ORACLE \ home0 \ NLS_SORT (win registry)

关于NLS_SORT:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams130.htm

关于NLSSORT函数:

http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions111.htm#SQLRF00678

关于SCHINESE_RADICAL_M、SCHINESE_STROKE_M、SCHINESE_PINYIN_M等:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/applocaledata.htm#g683050

改变Oralce 对简体汉字的排序规则:

http://space.itpub.net/519536/viewspace-627797

引用

如果数据库字符集选用的是ZH16GBK,那么使用order by默认是按照汉字的拼音顺序进行排序的。有方法改变这个默认规则么?

答案是肯定的,Oracle针对简体中文提供三种排序方法,主要是围绕“拼音”、“部首”和“笔画数”展开的。

通过实验,给大家展示一下NLSSORT在改变简体汉字排序规则方面的魅力。

1.在Oracle的官方文档中关于排序有如下描述

“Linguistic Sorts”

http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/applocaledata.htm#sthref2000

其中表“Table A-15 Multilingual LInguistic Sorts”中我们关注一下有关中文排序的内容(前三条与简体中文排序有关,后两条与繁体中文排序有关):

1)SCHINESE_RADICAL_M

Simplified Chinese sort based on radical as primary order and number of strokes order as secondary order

注释:简体中文按照第一顺序是“部首”第二顺序是“笔画数”进行排序;

2)SCHINESE_STROKE_M

Simplified Chinese sort uses number of strokes as primary order and radical as secondary order

注释:简体中文按照第一顺序“笔画数”是第二顺序是“部首”进行排序;

3)SCHINESE_PINYIN_M

Simplified Chinese PinYin sorting order

注释:简体中文按照“拼音”进行排序;

4)TCHINESE_RADICAL_M

Traditional Chinese sort based on radical as primary order and number of strokes order as secondary order

注释:繁体中文按照第一顺序是“部首”第二顺序是“笔画数”进行排序;

5)TCHINESE_STROKE_M

Traditional Chinese sort uses number of strokes as primary order and radical as secondary order. It supports supplementary characters.

注释:繁体中文按照第一顺序“笔画数”是第二顺序是“部首”进行排序;

2.创建实验表T,并初始化六条记录

sec@secooler> create table t (x varchar2(10));

sec@secooler> insert into t values ('侯');

sec@secooler> insert into t values ('你');

sec@secooler> insert into t values ('做');

sec@secooler> insert into t values ('拉');

sec@secooler> insert into t values ('推');

sec@secooler> insert into t values ('拆');

sec@secooler> commit;

sec@secooler> select * from t;

X

------------------------------

6 rows selected.

3.确认数据库版本和数据库字符集

sec@secooler> select * from v$version;

BANNER

----------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

sec@secooler> select userenv('language') from dual;

USERENV('LANGUAGE')

-----------------------------------------------------------

AMERICAN_AMERICA.ZHS16GBK

4.在此环境下,查看默认的汉字排序规则

sec@secooler> select * from t order by x;

X

------------------------------

6 rows selected.

可见,此时的默认汉字排序规则是“拼音”。

5.使用nlssort强制按照拼音排序的方法

sec@secooler> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_PINYIN_M');

X

------------------------------

6 rows selected.

6.使用nlssort强制按照“部首”(第一顺序)和“笔画数”(第二顺序)排序的方法

sec@secooler> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_RADICAL_M');

X

------------------------------

6 rows selected.

单人旁的汉字在前,提手旁汉字在后;单人旁的三个汉字进一步又是按照笔画数多少进行的排序。

7.使用nlssort强制按照“笔画数”(第一顺序)和“部首”(第二顺序)排序的方法

sec@secooler> select * from t order by nlssort(x,'NLS_SORT=SCHINESE_STROKE_M');

X

------------------------------

6 rows selected.

可见,越往后的汉字的笔画数越多。

8.Oracle官方文档中关于NSLSORT函数的描述参考

http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions111.htm#SQLRF00678

9.小结

NSLSORT函数在国际化支持上提供了一个非常好的排序解决方案。在具体应用环境下有其重要的意义。善用之。

Good luck.

分享到:

2010-06-02 09:17

浏览 11050

分类:数据库

评论

1 楼

yljf1314

2012-03-02

oracle mysql 中文排序规则_Oracle 对汉字的order by排序规则相关推荐

  1. oracle mysql 中文排序规则_ORACLE对中文排序性能优化

    Oracle提供了以下类型的排序方式:(1)二进制排序(2)单语言形式排序(3)多语言形式排序 使用二进制排序排序字符数据的一种方法是基于字符的数值定义的字符编码方案.这就是所谓的二进制排序.二进制排 ...

  2. oracle排序非英文最后,Oracle中中文、数字,英文混杂形式的字段进行排序的方法...

    http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...

  3. oracle 取英文排序,Oracle中中文、数字,英文混杂形式的字段进行排序的方法

    http://blog.csdn.net/p451933505/article/details/9272257 对Oracle中中文.数字.英文混杂形式的字段进行排序的方法: 例如: order by ...

  4. mysql orderitems_【Mysql】教程全解(三)ORDER BY 排序

    3.1  order by 当使用SELECT语句查询表中的数据时,结果集不按任何顺序进行排序.要对结果集进行排序,请使用ORDER BY子句. ORDER BY子句允许:对单个列或多个列排序结果集. ...

  5. mysql中文字符存储_mysql定义汉字存储类型

    mysql手册上说: 在MySQL 5.x版本中,CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数.例如,CHAR(30)可以占用30个字符.GBK内码的情况下,一个汉字占两个字节,但 ...

  6. oracle mysql事物隔离级别_Oracle数据库事物隔离级别

    事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度. 两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题: 1.幻想读:事务T1读取一条指定where条件的语句,返回结果集.此 ...

  7. oracle mysql 数据验证工具_Oracle Orion tool check io(ORACLE Orion 工具查看以及校验IO)

    文档主要来自oracle官方文档performance 8.3章节 Oracle数据库提供了Orion,一种 I/O校准工具.Orion是预测Oracle数据库性能的工具,无需安装Oracle或创建数 ...

  8. oracle mysql查询速度慢_oracle 根据时间范围查询缓慢问题排查解决

    今天生产环境上碰到个奇怪问题,在oracle数据库一个根据时间范围的查询语句居然执行了二十多分钟.一开始打印了执行sql日志之后就毫无反应了,任何错误都没有.把进程反复重启几次也一样.直到二十分钟后就 ...

  9. sql server如何输出排序序号_Group by中子查询order by排序失效问题分析

    通过sql分组查询数据时,一般通过group by来完成,group by默认取相同的分组列(一列或者多列)中第一个数据. 如果想获取sql分组中id最大的记录,我们可能想到的sql如下(name列作 ...

  10. Order By 排序

    2022年7月27日 MySQL Order By 排序的两种策略,Order By排序的时候,会结合select字段的个数,已经字段占用的空间做评估.如果select字段占用的空间比较少,MySQL ...

最新文章

  1. 红外线可程序化?遥控器Motedem控制自家居住环境
  2. python3 eval代码示例
  3. P1488 肥猫的游戏
  4. 11 Python之初识函数
  5. 爬虫工具获取页面中域名及子域名(SQL注入、渗透)
  6. MFC之CString与const char* string 转换
  7. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS
  8. u-boot-2010.09移植(A)
  9. 不要打开文件,阅读Rvt信息档案
  10. Fgui切割图集为散图
  11. 封装制作ghost xp,含加入域帐号配置迁移脚本。
  12. 学习记录:小程序图片上传至服务器
  13. python用实现FGO自动挂机战斗思路
  14. CC2420芯片手册核心知识点
  15. 开放存取知识库及其数据采集规范的研究
  16. Vue实战篇三十三:实现新闻的浏览历史
  17. QT QML 与C++ 混合编程
  18. 零基础,没方向,如何快速有效学习编程语言?
  19. 【附源码】计算机毕业设计java学习资源共享网站设计与实现
  20. 中国人海外购房似网购般简单:不看房先付款

热门文章

  1. gg修改器修改数值没有用怎么办_gg修改器修改游戏数值教程_gg修改器怎么修改数值_3DM手游...
  2. ImageOptim 图片压缩工具
  3. 【技术教程】如何调用宇视SDK实现摄像机的云台控制?
  4. android优化大师下载最新版,安卓优化大师(正式版)
  5. linux alsa工具,浅析alsa-utils工具aplay, mplayer
  6. Julia实现重心法(单设施选址问题)
  7. 激光条纹中心提取——zhang细化+灰度重心法
  8. 计算机更新bios,GIGABYTE How to Reflash VGA BIOS
  9. 通过IP地址获取对方MAC地址的命令
  10. K均值算法(K_means)