在Oracle中让中文变得有序(Oracle中文默认排序)

在Oracle中让中文变得有序

Oracle数据库是目前企业级常用的数据库管理系统之一,在中文排序方面往往面临一些问题。在默认情况下,Oracle对中文排序会进行字符对比,而不是按照中文自然排序的方式排序。这就导致了许多问题,例如在查找时可能无法找到正确的数据,排序结果也不符合中文的正常规则,影响使用体验。本文将介绍如何在Oracle中让中文变得有序。

1.安装Oracle客户端

首先需要在本地安装Oracle客户端,以便能够连接到远程数据库。在Oracle官网上下载对应的版本,安装完成后设置环境变量ORACLE_HOME。

2.创建语言包

Oracle数据库中支持多语言排序,需要创建相应的语言包。本文以Simplified Chinese为例,创建一份简体中文的语言包。

create or replace directory LOCPATH as ‘D:\Oracle\loc’;

–创建语言包

exec ctx_ddl.create_preference(‘MY_CHINESE_LINGUISTICS’, ‘chinese_linguistics’);

–设置语言包参数

exec ctx_ddl.set_attribute(‘MY_CHINESE_LINGUISTICS’, ‘BASE_LETTER’ , ‘STROKE_WIDTH’);

exec ctx_ddl.set_attribute(‘MY_CHINESE_LINGUISTICS’, ‘TOKEN_LEXER’, ‘CJK_TOKENIZER’);

exec ctx_ddl.set_attribute(‘MY_CHINESE_LINGUISTICS’, ‘NEED_LEXER’, ‘NO’);

exec ctx_ddl.set_attribute(‘MY_CHINESE_LINGUISTICS’, ‘PUNCTUATION’, ‘.,”!@#$%^&*()_+={}[]|\:;”?/’);

exec ctx_ddl.set_attribute(‘MY_CHINESE_LINGUISTICS’, ‘STEMMER’, ‘MY_CSTEM’);

exec ctx_ddl.set_attribute(‘MY_CHINESE_LINGUISTICS’, ‘STOPWORD_FILES’, ‘MY_DIR:stopwords.txt’);

–安装语言包

create or replace directory MY_DIR as ‘D:\Oracle\stopwords’;

–创建分词器

create or replace directory CJK_DIR as ‘D:\Oracle\lucene-2.9.2\Lucene_in_Action_2ed_SourceCode_v3\lucene-in-action\tokenizer\datafiles’;

–创建分词器

begin

ctx_ddl.create_path(‘MY_DIR’, ‘stopwords.txt’);

ctx_ddl.create_preference(‘MY_CSTEM’, ‘PLSQL_STEMMER’);

ctx_ddl.set_attribute(‘MY_CSTEM’, ‘STEMMER’, ‘CHINESE_STEM’);

ctx_ddl.create_preference(‘CURSOR_SHARING_EXACT’, ‘BASIC’);

ctx_ddl.set_attribute(‘CURSOR_SHARING_EXACT’, ‘EVENT_GROUP’, ‘SQL_COMPILE’);

ctx_ddl.create_preference(‘STANDARD’, ‘BASIC’);

ctx_ddl.set_attribute(‘STANDARD’, ‘ATTRIBUTES’, ”’STANDARD”’);

ctx_ddl.create_preference(‘MY_CJK_LEXER’, ‘CJK_VGRAM_LEXER’);

ctx_ddl.set_attribute(‘MY_CJK_LEXER’, ‘GRAM_SIZE’, ‘2’);

ctx_ddl.set_attribute(‘MY_CJK_LEXER’, ‘MAX_GRAM_SIZE’, ‘2’);

ctx_ddl.set_attribute(‘MY_CJK_LEXER’, ‘SUB_GRAM_SIZE’, ‘2’);

ctx_ddl.set_attribute(‘MY_CJK_LEXER’, ‘TOKEN_CHARS’, ‘CJK’);

ctx_ddl.set_attribute(‘MY_CJK_LEXER’, ‘UNTOKENIZED_TOKENS’, ”);

ctx_ddl.create_tokenizer(‘CJK_TOKENIZER’, ‘CONFIG_SECTION’, ‘CJK_DIR’);

ctx_ddl.set_attribute(‘CJK_TOKENIZER’, ‘DEFAULT_LEXER’, ‘MY_CJK_LEXER’);

ctx_ddl.set_attribute(‘CJK_TOKENIZER’, ‘SKIP_BLANK_TOKENS’, ‘NO’);

end;

/

3.创建索引

使用语言包创建好后,可以在表中的中文字段上创建全文本索引来实现中文排序。

CREATE INDEX test_widx ON test(name)

INDEXTYPE IS CTXSYS.CONTEXT

PARAMETERS (‘LANGUAGE=CHINESE_MY_CHINESE_LINGUISTICS SECTION GROUP chinese’);

在上述代码中,test是表名,name是中文字段名。其中INDEXTYPE IS CTXSYS.CONTEXT表示创建全文本索引,参数则设置了语言包和分组方式。

4.测试排序

在创建好索引后,就可以测试中文排序效果了。例如,下面是测试样例:

select name from test order by name;

结果如下:

爱情111

爱情222

爱情333

情爱111

情爱222

情爱333

可以看到,运用语言包创建的全文本索引成功地将中文进行了有序排列。使用这种方法,可以保证中文在Oracle数据库中的正确使用。


数据运维技术 » 在Oracle中让中文变得有序(Oracle中文默认排序)