在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数据库中的正确使用。