2011-07-13 82 views
5

我們的Oracle DB是UTF8。我們正在存儲需要搜索的地址。部分街道名稱包含非英文字符(例如PeñaBáináõ),需要搜索「PeñaBáináõ」或英文等同字符「佩納貝012」。我們所做的是將文本轉換的查詢,像:帶有非英文字符的Oracle搜索文本

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

但這裏的問題是,並非所有的人物都有一個相當於英語(甚至一些很明顯的像N或O),所以我們最終的文本轉換爲:

Pe?a Baina? 

因此,如果用戶試圖找到ADDRES鍵入「佩納百腦匯」他找不到它,因爲「佩納百腦匯」是「」不同Pe?a Baina?「」。

我們已經想出了一些骯髒的workarrounds在這個,但我想先檢查,如果有人找到了更優雅的解決方案。

下面是一些字符不被轉換爲US7ASCII列表:使用nlssort與BINARY_AI(無論大小寫和重音insentive)

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

回答

5

1):

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將改變其他查詢的行爲,可能不是你想要的。請參閱Oracle® Database Globalization Support GuideTable 5-2。另請參閱「Using Linguistic Indexes」部分,瞭解如何使用索引。

+0

也考慮SOUNDEX和其他基於相似性的功能。 – Randy

+2

'soundex('Pena Bainao')'yeilds P515,'soundex('PeñaBáináõ')'yeilds P150。會話參數NLS_SORT和NLS_COMP不會影響結果。 –

+0

@Shannon Severance:很好,ALTER SESSION SET NLS_COMP = LINGUISTIC和ALTER SESSION SET NLS_SORT = BINARY_AI也沒有這個竅門,但它們顯着降低了查詢的複雜度。非常感謝! – Chepech