Oracle提供了以下类型的排序方式:(1)二进制排序(2)单语言形式排序(3)多语言形式排序
使用二进制排序排序字符数据的一种方法是基于字符的数值定义的字符编码方案。这就是所谓的二进制排序。二进制排序是最快的类型的排序。他们对英文字母产生合理的结果,因为ASCII、EBCDIC标准定义提升数值的字母A到Z。
(在ASCII标准,所有大写字母排在小写字母之前。在EBCDIC标准,情况恰恰相反:所有小写字母排在大写字母之前)
单语言形式排序
单语言形式排序中oracle比较字符串分两个步骤。第一步从一个主要值表中比较整个字符串的主要值。通常,字母相同的外观有相同的主要值。第二步从一个次要值表中比较次要值。主要值、次要值都是有oracle定义的。甲骨文将字母与发音符号的情况差异定义为拥有相同的主要值但不同的次要值。
(单语言形式排序是不能用于unicode数据库多字节字符集。如果指定一个单语言数据库字符集是unicode多字节,那么默认的排序顺序是二进制排序顺序的数据库字符集。UNICODE_BINARY是一个例外。这种对所有字符集可用。)
多语言形式排序
Oracle提供多语种语言类型,这样就可以对一种数据支持多种语言的排序。这一般应用在地区或语言有复杂的排序规则和多语言数据库。oracle10g之前上一版本定义的所有的排序方式。
对于亚洲语言数据或多语言数据,Oracle提供了一个排序机制基于ISO
14651标准和Unicode 4.0标准。汉字是按照笔画,拼音或部首排序。
oracle 对中文排序方式
oracle数据库在创建时可以执行数据库的语言,也可以通过alter
session来修改。如果在创建数据库是执行,则所有的session中会生效。使用 select * from
nls_session_parameters
语句可以看到NLS_SORT的值。
默认NLS_SORT的值为BINARY还可以将其修改为:SCHINESE_RADICAL_M、SCHINESE_STROKE_M、SCHINESE_PINYIN_M
1、设置NLS_SORT参数值
SCHINESE_RADICAL_M
按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M
按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M 按照拼音排序
2、Session级别的设置,修改ORACLE字段的默认排序方式:
按拼音:alter session set nls_sort =
SCHINESE_PINYIN_M;
按笔画:alter session set nls_sort =
SCHINESE_STROKE_M;
按偏旁:alter session set nls_sort =
NLS_SORT=SCHINESE_RADICAL_M;
3、语句级别设置排序方式:
按照笔划排序
select * from dept order by
nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
按照部首排序
select * from dept order by
nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
按照拼音排序,此为系统的默认排序方式
select * from dept order by
nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
4、修改系统参数(数据库所在操作系统):
set NLS_SORT=SCHINESE_RADICAL_M
;export NLS_SORT (sh)
setenv NLS_SORT SCHINESE_RADICAL_M
(csh)
HKLCSOFTWAREORACLEhome0NLS_SORT
(win注册表)
oracle 在对中文列创建索引时是按照二进制编码进行排序的
如果NLS_SORT被设置为binary时,排序则可以利用索引。如果中文:SCHINESE_PINYIN_M、SCHINESE_RADICAL_M、SCHINESE_STROKE_M
oracle是无法使用索引,需要在对应列上创建linguistic index
例如:CREATE INDEX nls_index ON my_table
(NLSSORT(name, 'NLS_SORT = SCHINESE_PINYIN_M'));