zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Oracle对中文内容排序

2023-09-27 14:26:14 时间

一、需求说明

目前需要开发的Oracle数据库中有些表记录的内容是中文的,需要按照中文的方式进行排序。

二、分析思路
如果查询的结果字符集为ZHS16GBK/ZH16GBK,则使用order by默认是按照汉字的拼音顺序进行排序的;否则为其他(如UTF8等字符集),那么汉字的排序是按照BINARY(二进制)排序的,那么此时可以使用Oracle提供的NLS_SORT进行排序。

--查看当前数据库使用的字符集(语法)
SELECT userenv('language') FROM dual;
 
--查看整个数据库的NLS_SORT排序规则(语法)
select value from nls_database_parameters where parameter='NLS_SORT'; 
  
--查看当前会话的NLS_SORT排序规则(语法)
select value from nls_session_parameters where parameter='NLS_SORT';

三、解决方法

这是人员表中的原内容:

 

 3.1、按照拼音排序

--按照拼音排序(语法)
SELECT 字段名 FROM 表名 ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_PINYIN_M');
 
--执行示例
SELECT "Name" FROM "PeopleInfo"  ORDER BY NLSSORT("Name",'NLS_SORT = SCHINESE_PINYIN_M');

执行示例结果如下: 

 

 3.2、按照笔画数排序

--按照笔画数排序(语法)
SELECT 字段名 FROM 表名 ORDER BY NLSSORT(排序字段名,'NLS_SORT=SCHINESE_STROKE_M');
 
--执行示例
SELECT "Name" FROM "PeopleInfo"  ORDER BY NLSSORT("Name",'NLS_SORT=SCHINESE_STROKE_M');

执行示例结果如下: 

 

 3.3、按照偏旁部首排序

--按照偏旁部首排序(语法)
SELECT 字段名 FROM 表名 ORDER BY NLSSORT(排序字段名,'NLS_SORT=SCHINESE_RADICAL_M');
 
--执行示例
SELECT "Name" FROM "PeopleInfo"  ORDER BY NLSSORT("Name",'NLS_SORT=SCHINESE_RADICAL_M');

  执行示例结果如下: 

 

 四、对汉字的一、二、三等数字排序

这是区域表中的原内容:

 

 实现对汉字一、二、三等排序的语法:

--实现对汉字一、二、三排序(语法)
SELECT 需排序的字段名 FROM 表名 order by TRANSLATE(需排序的字段名,'零一二三四五六七八九','0123456789');
 
--执行示例 
SELECT "Area" FROM "AreaInfo" order by TRANSLATE("Area",'零一二三四五六七八九','0123456789');

 执行示例结果如下: