Oracle数据库汉字中文字段order by排序的方法总结

一,最常用的排序方法

1)按笔画排序

select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STROKE_M')

2)按部首排序

select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_RADICAL_M')

3)按拼音排序

select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_PINYIN_M');

补充:

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

其中表“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.

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

时间: 2024-12-21 14:05:25

Oracle数据库汉字中文字段order by排序的方法总结的相关文章

Oracle数据库中对null值的排序及mull与空字符串的区别_oracle

order by排序之null值处理方法在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前.所以,为何分析数据的直观性方便性,我们需要对null的记录值进行相应处理. 这是四种oracle排序中NULL值处理的方法:1.使用nvl函数语法:Nvl(expr1, expr2)     若EXPR1是NULL,則返回

ORACLE数据库汉字占几个字节问题

一同事由于系 统需求关系,将SQL SERVER数据库的一个表导入ORACLE数据库时,发现居然报错:ORA-12899: value too large for column xxxx (actual:56, maximum:50),该字段长度在两个数据库都是50,之所以出现这个错误,原因无外乎两个: 一:因为ORACLE数据库它可以存储字节或字符,例如 CHAR(12 BYTE) CHAR(12 CHAR)的意义是不同的.一般来说默认是存储字节,你可以查看数据库参数NLS_LENGTH_SE

y 中文乱码-PHP环语言对MySQL数据库进行中文字段的数据插入和查询时候遇到的乱码问题

问题描述 PHP环语言对MySQL数据库进行中文字段的数据插入和查询时候遇到的乱码问题 #定义插入数据库的时候定义插入的字符串的编码为 mysql_query('SET NAMES UTF8'); 这时候通过PhpMyadmin能够正常看到插入的正文字段信息,但是通过 mysql_query("select * from $table_name limit $offset,$rows"); 查询该字段的时候,显示的字段信息是乱码 如果不对插入数据库的编码做任何的定义,直接插入数据库中文

如何读取oracle数据库中表的字段,然后上传到excel服务器(勤哲excel2008服务器)

问题描述 如何读取oracle数据库中表的字段,然后上传到excel服务器(勤哲excel2008服务器) 解决方案 解决方案二:路过帮顶=============11月6日,论坛升级公告,积分已经做了调整!http://topic.csdn.net/u/20081107/11/b27dc75f-14b1-4594-9de3-5b18d9e36a11.html此次调整增加了两个新的可用分获取渠道:1:帖子被推荐(加精)后,帖主可以获得88分的可用分奖励:2:帖子结帖后会返还帖主50%的悬赏分,无

jsp实现添加视频文件到oracle数据库的blob字段

问题描述 jsp实现添加视频文件到oracle数据库的blob字段,求实现方法 解决方案 解决方案二:视频流文件转换成byte数组解决方案三:你先获取视频流,然后自己封装一把持久化到blob解决方案四:参考下吧:importjava.io.BufferedInputStream;importjava.io.FileInputStream;importjava.io.PrintStream;importjava.sql.Connection;importjava.sql.DriverManager

简单说明Oracle数据库中对死锁的查询及解决方法_oracle

死锁的原理当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态, 此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错.   死锁的定位方法通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台.   1)用dba用户执行以下语句 select username,lockwait,status,machine,program from v$session where sid in (s

Oracle数据库动态注册和参数local_listener的使用方法

从Oracle8i版本开始,在oracle数据库当中,应用如果没有特殊需求的话,数据库监听不需要做出配置,oracle把这种方法称为动态注册.所谓动态注册,oracle通过PMON进程根据参数instance_name和service_names中的内容,把oracle数据库的信息注册到默认的1521端口的监听器上.不管服务器端有几个监听程序,oracle默认都是注册到1521端口的监听器,也就是说,对于其他端口的监听器来说,如果想要正常的识别远程客户端提供的信息,需要做出配置,也就是静态注册.

查找oracle数据库表中是否存在系统关键字的方法_oracle

今天在工程中遇到"ORA-01747: user.table.column, table.column 或列说明无效"的报错情况,查了一下是由于数据库列名起的不好引起的,名字用到了数据库的关键字. select * from v$reserved_words where keyword in( select COLUMN_NAME from all_tab_columns where table_name = '表名大写' and owner='用户名大写' ); ID可以忽略 以上是

SQL Server数据库获取TEXT字段的内容长度的方法

SQL Server数据库如何获取TEXT字段的内容长度呢?本文我们就来介绍一下SQL Server数据库如何获取TEXT字段的内容长度的方法,是通过DATALENGTH函数来实现的,接下来我们就通过DATALENGTH函数的语法及使用实例来了解一下这部分内容.   DATALENGTH用来返回任何表达式所占用的字节数. 语法:DATALENGTH ( expression ) 参数:expression,任何类型的表达式. 返回类型:int 注释:DATALENGTH 对 varchar.va