使用Oracle搜索包含非英文字符的文本

5
我们的Oracle数据库是UTF8编码。我们正在存储需要进行搜索的地址。一些街道名称包含非英文字符(例如Peña Báináõ),需要将其作为"Peña Bá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个回答

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

Option 1仅更改本地行为,即你想要不同结果的查询。选项2和3将更改其他查询的行为,可能不是你想要的。请参见表5-2Oracle®数据库全球化支持指南。另请查看“使用语言学索引”部分,了解如何能够使用索引。

还要考虑SOUNDEX和其他基于相似度的函数。 - Randy
2
soundex('Pena Bainao') 的结果为 P515,soundex('Peña Báináõ') 的结果为 P150。会话参数 NLS_SORT 和 NLS_COMP 不会影响结果。 - Shannon Severance
@Shannon Severance:非常好,ALTER SESSION SET NLS_COMP=LINGUISTIC 和 ALTER SESSION SET NLS_SORT=BINARY_AI 不仅解决了问题,而且显著降低了查询的复杂度。非常感谢! - Chepech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接