Oracle搜索带有非英文字符的文本
我们的Oracle DB是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)使用nlssort和BINARY_AI(案例和重音insentive):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-2的Table 5-2.另请参阅“Using Linguistic Indexes”部分以了解如何使用索引. (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |