[英]Accented Search in sqlite (android)
我有一個列,其中一些元素包含重音字母。 例如:Grambú
我的要求是,當我搜索“Grambu”時,我也應該在結果中獲得“Grambú”。
對於此要求,我嘗試對該特定列使用“COLLATE NOCASE”參數。 但那沒有用。
當我在網上搜索解決方案時,我發現許多人建議對重音字符進行規范化,並根據它創建另一個列作為唯一選項。
這個問題還有其他更簡單的解決方案嗎?
COLLATE NOCASE
僅適用於ASCII的26個大寫字符 。
使用setLocale()
將數據庫的語言環境設置為具有重音字符支持的語言環境,並使用COLLATE LOCALIZED
。
您也可以嘗試使用COLLATE UNICODE
。 但要注意這個錯誤: 在ICS中打破SQLite UNICODE排序 - 不再不區分大小寫 。
查看文檔,了解Android中這兩個整理器的提及情況。
另請查看此在線整理演示工具 。
http://www.sqlite.org/lang_expr.html
(一個錯誤:默認情況下,SQLite只能理解ASCII字符的大寫/小寫。對於超出ASCII范圍的unicode字符,LIKE運算符默認區分大小寫。例如,表達式'a'LIKE'A'為TRUE但是'æ'LIKE'Æ'是假的。)
在Android sqlite中, LIKE
和GLOB
忽略COLLATE LOCALIZED
和COLLATE UNICODE
。 但是,有一個解決方案,無需在表中添加額外的列。 正如@asat在本回答中所解釋的那樣,您可以使用GLOB
,其模式將用該字母的所有可用替代字替換每個字母。 在Java中:
public static String addTildeOptions(String searchText) {
return searchText.toLowerCase()
.replaceAll("[aáàäâã]", "\\[aáàäâã\\]")
.replaceAll("[eéèëê]", "\\[eéèëê\\]")
.replaceAll("[iíìî]", "\\[iíìî\\]")
.replaceAll("[oóòöôõ]", "\\[oóòöôõ\\]")
.replaceAll("[uúùüû]", "\\[uúùüû\\]")
.replace("*", "[*]")
.replace("?", "[?]");
}
然后(當然不是這樣的):
SELECT * from table WHERE lower(column) GLOB "*addTildeOptions(searchText)*"
這樣,搜索Grambu或Grambú的用戶將搜索轉換為Gramb [uúùüû] ,返回兩個結果。
重要的是要注意GLOB
忽略COLLATE NOCASE
,這就是我在函數和查詢中將所有內容都轉換為小寫的原因。 另請注意,sqlite中的lower()
函數不適用於非ASCII字符 - 但這些可能是您已經替換的那些!
該函數還替換了GLOB
通配符, *
和?
,“逃脫”版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.