Oracle 中文排序 NLSSORT NLS_SORT

今天发现了个挺有意思的函数:NLSSORT,发现能给中文按拼音、笔画、部首排序,遂查了下相关资料,结果如下:

Oracle 9i开始,新增了按照拼音、部首、笔画排序功能。

通过设置NSL_SORT值来实现:

SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序

SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序

SCHINESE_PINYIN_M 按照拼音排序

实现中文排序有两种常见方式:

  1. session级

    ALTER SESSION SET NLS_SORT='XXX';

    此结果影响整个session。

  2. sql级

    SELECT * FROM TABLE_XXX ORDER BY NLSSORT(字段名, 'NLS_SORT=XXX');

例:

CREATE TABLE test_sort(NAME VARCHAR2(50));

INSERT INTO test_sort(NAME) VALUES('中国');
INSERT INTO test_sort(NAME) VALUES('山西');
INSERT INTO test_sort(NAME) VALUES('北京');
INSERT INTO test_sort(NAME) VALUES('陕西');
INSERT INTO test_sort(NAME) VALUES('河北');
INSERT INTO test_sort(NAME) VALUES('湖北');
INSERT INTO test_sort(NAME) VALUES('河南');

默认排序结果: 默认排序以BINARY排序,即二进制排序

SQL> SELECT * FROM test_sort ORDER BY NAME;

NAME
--------------------------------------------------
中国
北京
山西
河北
河南
湖北
陕西
7 rows selected

拼音排序结果:

SQL> SELECT * FROM test_sort ORDER BY NLSSORT(NAME, 'NLS_SORT=SCHINESE_PINYIN_M');

NAME
--------------------------------------------------
北京
河北
河南
湖北
山西
陕西
中国
7 rows selected

笔画排序结果:

SQL> SELECT * FROM test_sort ORDER BY NLSSORT(NAME, 'NLS_SORT=SCHINESE_STROKE_M');

NAME
--------------------------------------------------
山西
中国
北京
河北
河南
陕西
湖北
7 rows selected

部首排序结果:

SQL> SELECT * FROM test_sort ORDER BY NLSSORT(NAME, 'NLS_SORT=SCHINESE_RADICAL_M');

NAME
--------------------------------------------------
中国
北京
山西
河北
河南
湖北
陕西
7 rows selected

原文地址:http://blog.51cto.com/baser/2139625

时间: 2024-10-10 14:54:29

Oracle 中文排序 NLSSORT NLS_SORT的相关文章

ORACLE的order by中文排序

在使用order by排序的时候,出现如下情况:   印象中中文排序应该默认是按照拼音排序的,为何"鑫"会排在"中"的后面呢?猜想order by是不是根据对应字符的ASCII码排的呢,因此列出了对应的ASCII,如下:   由此基本可以断定,确实是通过ASCII的大小来排序的,这也解释了为什么数字会排在字母之前,字母为什么会排在汉字之前的现象.但是为什么会出现汉字默认是通过拼音排序的错觉呢,于是查了一下汉字的编码规则,有提到如下一句:       "一级

PHP与MYSQL中UTF8 中文排序例子

1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gbk和gb2312可以.这跟几种格式的编码有关系.gbk和gb2312本身的编码就是用拼音排序的. 代码如下 复制代码 function utf8_array_asort(&$array){if(!isset($array) || !is_array($array)){return false;}foreach($array as $k=>$v){$array[$k] = iconv('UTF-

iOS 中文排序

这里分享一个中文排序的一个便捷方法,整理了一个网络的资源自己封装成一个类别方便以后使用, 这里贴出使用的方法,源码可以在本文最后下载. 要记得加头文件 #import "NSArray+SortedChinAndEng.h" 这个头文件在源码中. NSArray *[email protected][ @"小明", @"微博", @"你好", @"小米", @"腾讯", @"再

关于字典与数组的倒叙,自定义排序,中间目录、中文排序

// //  main.m //  10.1.2 // //  Created by fwzx11 on 16/1/10. //  Copyright (c) 2016年 Blue Mobi. All rights reserved. // #define NSLog(FORMAT, ...) fprintf(stderr,"%s\n",[[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]); #import &l

linux安装Oracle中文乱码问题汇总

解决oracle中文显示乱码有三层地方需要调整或者修改 第一层:操作系统层 1.首先查看linux是否有安装中文字符集, locale -a 2.设置用户的中文字符集 查看到linux安装了中文字符集,那么oracle用户下面要设置中文字符集 vi /etc/locale.conf # centos7是这个配置文件,有的linux是这个配置文件/etc/sysconfig/i18n LANG="zh_CN.UTF-8" 上面的那种方法设置完后,系统所有用户的字符集都是UTF-8.也可以

练习 字符串存入字典 数组的降序 倒序 字符串目录存不存在 数组中文排序

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { /* 第1题 请将如下数据存储成字典,并将字典内容以字符串形式输出,输出:"XXX,年龄XXX岁,科目XXX,分数XXX"(将XXX替换为相应的数据). */ NSString *name = @"张三"; NSInteger age = 22; NSNumber 

一月十日练习习题,1数组数据存入字典并输出2降序 和倒叙 输出数组中内容3对字符串当中信息进行查找是否存在4 把数组当中信息尽心中文排序

// //  main.m //  Pratise_Jan10_1 // //  Created by wangyang on 16/1/10. //  Copyright (c) 2016年 Wangyang. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { /* 第1题 请将如下数据存储成字典,并将字典

死去活来的OC NSArray 中文排序 及输出

目的 1.NSArray 可以支持中文排序 2.NSLog 可以直接输出 NSArray 内的中文(其实 java 直接打印数组也不能显示内容哈) 又是死去活来的搞了1个小时,分类实现,废话少说,上代码 main.m #import <Foundation/Foundation.h #import "NSArray+Log.h" int main(int argc, const char * argv[]) { NSArray * arr = [NSArray arrayWith

yii下使用oracle中文都变成问号乱码的解决方法

在配置文件中,一般会用以下配置: 'db_oracle'=>array( 'class' => 'CDbConnection', 'connectionString'=>'oci:dbname=服务器地址/服务名', 'username'=>'用户名', 'password'=>'密码', 'charset' => 'utf8', 'enableParamLogging'=>true, ), 我试了千万遍,找了N久的资料,就是不行,在thinkphp中发现也没有什