Oracle搜索带有非英文字符的文本

时间:2011-07-13 16:21:40

标签: oracle encoding utf-8 internationalization

我们的Oracle数据库是UTF8。我们正在存储需要搜索的地址。一些街道名称包含非英语字符(例如PeñaBáináõ),这需要作为“PeñaBáináõ”或与“ Pena Bainao ”等英语等效字符进行搜索。 。我们所做的是转换查询中的文本,如:

SELECT CONVERT('Peña Báináõ','US7ASCII') as converted FROM dual;

但问题在于,并非所有角色都具有英语等效(甚至不是一些非常明显的角色,如ñ或õ)所以我们最终将文本转换为:

Pe?a Baina?

因此,如果用户试图找到输入“ Pena Bainao ”的地址,他找不到它,因为“ Pena Bainao ”与“不同Pe?a Baina?“”。

我们已经找到了一些肮脏的工作场所,但我想首先检查是否有人找到了更优雅的解决方案。

以下是一些未转换为US7ASCII的字符列表:

Character     UTF8 Code     Possible Equivalent   
æ         -   u00E6      -      ae
å         -   u00E5      -       a
ã         -   u00E3      -       a
ñ         -   u00F1      -       n
õ         -   u00F5      -       o

1 个答案:

答案 0 :(得分:5)

1)将nlssort与BINARY_AI一起使用(案例和重音无论如何):

SQL> select nlssort('Peña Báináõ', 'NLS_SORT = BINARY_AI') C from dual;

C
------------------------
70656E61206261696E616F00

SQL> select nlssort('Pena Bainao', 'NLS_SORT = BINARY_AI') C from dual;

C
------------------------
70656E61206261696E616F00

SQL> select nlssort('pena bainao', 'NLS_SORT = BINARY_AI') C from dual;

C
------------------------
70656E61206261696E616F00

SQL> select 'true' T from dual where nlssort('pena bainao', 'NLS_SORT = BINARY_AI') = nlssort('Peña Báináõ', 'NLS_SORT = BINARY_AI') ;

T
----
true

2)您也可以将NLS_SORT会话变量更改为binary_ai,然后您不必每次都指定NLS_SORT:

SQL> select 'true' T from dual where nlssort('pena bainao') = nlssort('Peña Báináõ') ;

no rows selected

SQL> alter session set nls_sort = binary_ai;

Session altered.

SQL> select 'true' T from dual where nlssort('pena bainao') = nlssort('Peña Báináõ') ;

T
----
true

3)要放弃使用nlssort函数并更改所有内容的语义,还要设置nls_comp会话变量:

SQL> select 'true' T from dual where 'pena bainao' = 'Peña Báináõ';

no rows selected

SQL> alter session set nls_comp = linguistic;

Session altered.

SQL> select 'true' T from dual where 'pena bainao' = 'Peña Báináõ';

T
----
true

选项1仅更改本地行为,即您想要不同结果的查询。选项2和3将改变其他查询的行为,可能不是您想要的。请参阅Table 5-2Oracle® Database Globalization Support Guide。另请查看“Using Linguistic Indexes”部分,了解如何使用索引。