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

带有非英语字符的Oracle搜索文本,oracle,encoding,utf-8,internationalization,Oracle,Encoding,Utf 8,Internationalization,我们的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

我们的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) 将
nlssort
与二进制AI一起使用(不区分大小写和重音):

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 session变量:

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将改变其他查询的行为,可能不是您想要的。见。也请看“如何使用索引”部分。

也考虑SoNeDX和其他基于相似性的函数。<代码> SunDeX(PNA Bayao)<代码> YILDS P515,<代码> SunDeX('pe Na A B Ain A''')< /代码> YelDDS P150。会话参数NLS_SORT和NLS_COMP不会影响结果。@Shannon Severance:太好了,ALTER Session SET NLS_COMP=Language和ALTER Session SET NLS_SORT=BINARY_AI也没有起到作用,但它们显著降低了查询的复杂性。谢谢!
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