汉字排序问题oracle

博客分类:

关于oracle order by排序:

引用

Oracle provides the following types of sorts:

Binary sort

Monolingual linguistic sort

Multilingual linguistic sort

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

关于NLS:National Language Support

Setting NLS Parameters:

查看数据库NLS相关信息:

Sql代码

select * from nls_database_parameters;

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

Sql代码

select * from nls_session_parameters;

关于Oracle汉字order by:

引用

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。

查看版本信息:

Sql代码

select * from v$version;

查看数据库字符集:

Sql代码

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:

引用

查看整个数据库的:Sql代码

select value from nls_database_parameters where parameter='NLS_SORT';

查看当前会话的:Sql代码

select value from nls_session_parameters where parameter='NLS_SORT';

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

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

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

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

Sql代码

ALTER session SET NLS_SORT = SCHINESE_PINYIN_M

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

到底怎么修改整个数据库的NLS_SORT那?有待继续考证(参照这个帖子做考证:)

二 也可在查询时指定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');

总:

引用

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:

关于NLSSORT函数:

关于SCHINESE_RADICAL_M、SCHINESE_STROKE_M、SCHINESE_PINYIN_M等:

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

引用

如果数据库字符集选用的是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.

博客分类:

关于oracle order by排序:

引用

Oracle provides the following types of sorts:

Binary sort

Monolingual linguistic sort

Multilingual linguistic sort

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

关于NLS:National Language Support

Setting NLS Parameters:

查看数据库NLS相关信息:

Sql代码

select * from nls_database_parameters;

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

Sql代码

select * from nls_session_parameters;

关于Oracle汉字order by:

引用

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。

查看版本信息:

Sql代码

select * from v$version;

查看数据库字符集:

Sql代码

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:

引用

查看整个数据库的:Sql代码

select value from nls_database_parameters where parameter='NLS_SORT';

查看当前会话的:Sql代码

select value from nls_session_parameters where parameter='NLS_SORT';

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

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

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

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

Sql代码

ALTER session SET NLS_SORT = SCHINESE_PINYIN_M

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

到底怎么修改整个数据库的NLS_SORT那?有待继续考证(参照这个帖子做考证:)

二 也可在查询时指定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');

总:

引用

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:

关于NLSSORT函数:

关于SCHINESE_RADICAL_M、SCHINESE_STROKE_M、SCHINESE_PINYIN_M等:

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

引用

如果数据库字符集选用的是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.


相关文章

  • 银监会专业笔试
  • 2015年的银监会计算机类专业科目笔试的真题.举例如下: [例1]"science"是XML 中一个元素的定义,其中元素的内容是( ). A.title B.style C.italic D.science [例2]SQ ...查看


  • 阿里巴巴的OracleDBA笔试题参考答案
  • 阿里巴巴的Oracle DBA笔试题参考答案+++++++++++++++++++++++++++++++++++++本文的阿里巴巴数据库面试题主要针对于Oracle DBA,题目可以是笔试题,也可以口头回答.以下题目,可根据自己情况挑选题 ...查看


  • 最近几周一直在进行数据库培训
  • 最近几周一直在进行数据库培训,老师精湛的技术和生动的讲解使我受益匪浅.为了让更多的新手受益,我抽空把SQL 语句优化部分进行了整理,希望大家一起进步. 一.操作符优化 1.IN 操作符 用IN 写出来的SQL 的优点是比较容易写及清晰易懂, ...查看


  • ORACLE入职考试题及答案
  • Oracle 基础知识入职考试题 答案中下划线部分需要引起注意重点. 1. 数据库database :存放一系列数据的仓库. 2. dos 模式下数据库备份.恢复命令:exp help=y ,imp help=y 3. 主要表空间table ...查看


  • infosys面试总结
  • 1. 作用域public,private,protected,以及不写时的区别 区别如下: 作用域 当前类 同一package 子孙类 其他package public √ √ √ √ protected √ √ √ × friendly ...查看


  • 数据库的内存结构
  • 系统全局区域(SGA )大型池(Large Pool ) 在SGA 中大型池是可选的缓冲区.它可以根据需要有管理权进行配置.它可以提供一个大的区以供象数据库的备份与恢复等操作. Oracle 实例的内存结构组织包含在称为系统全局区域(Sys ...查看


  • 培训机构课程设置
  • ◆ 填写 2 .问题/现象与培训需求分析 ◆专家讲师和技术咨询顾问分析"培训需求调查表",安排对客户实施访问.通过与客户的主管人员就开发项目的探讨和沟通,了解客户的现状与出现的问题,理解客户真正关心和希望达到的目的. 3 ...查看


  • 如何搭建一个数据库服务器平台
  • 如何搭建一个数据库服务器平台如何搭建一个数据库服务器平台 玩Oracle 2年多了,从接触Oracle 到现在,一直没有停止过学习. 要学的东西太多,刚入门的时候是这样的感觉,现在还是这样的感觉. 有时候也在想,还要学多长时间才能感觉自我良 ...查看


  • 2014计算机文化基础知识点
  • 计算机文化基础知识点 第一章 信息技术与计算机文化 1. 2. 3. 4. 5. 6. 7. 8. 9. <逻辑的数学分析>一书是19世纪中叶英国数学家布尔的著作 布尔提出了符号逻辑思想 控制论创始人美国数学家维纳认为:信息使我 ...查看


热门内容