sqlite中的重音搜索(android)
我有一个专栏,其中一些元素包含重音字母。 格拉姆布 我的要求是,当我搜索“Grambu”时,我也应该在结果中得到“Grambu” 对于这个需求,我尝试为特定列使用“collatenocase”参数。 但这不起作用 当我在网上搜索解决方案时,我发现很多人建议规范重音字符 并在此基础上创建另一列作为唯一选项sqlite中的重音搜索(android),android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我有一个专栏,其中一些元素包含重音字母。 格拉姆布 我的要求是,当我搜索“Grambu”时,我也应该在结果中得到“Grambu” 对于这个需求,我尝试为特定列使用“collatenocase”参数。 但这不起作用 当我在网上搜索解决方案时,我发现很多人建议规范重音字符 并在此基础上创建另一列作为唯一选项 这个问题还有其他更简单的解决方法吗?COLLATE NOCASE有效 使用和使用COLLATE LOCALIZED将数据库的区域设置设置为具有重音字符支持的区域设置 您也可以尝试使用。 但是要小
这个问题还有其他更简单的解决方法吗?
COLLATE NOCASE
有效
使用和使用COLLATE LOCALIZED
将数据库的区域设置设置为具有重音字符支持的区域设置
您也可以尝试使用。
但是要小心这个错误:
检查Android中提到的这两个collator
也可以看看这个。
(一个错误:SQLite默认情况下只理解ASCII字符的大小写。对于超出ASCII范围的unicode字符,LIKE运算符默认情况下区分大小写。例如,表达式'A'LIKE'A'为TRUE,而'æ'LIKE'Æ'为FALSE。)
在Android sqlite中,
像
和GLOB
一样忽略COLLATE本地化
和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("?", "[?]");
}
然后(当然不是字面上的意思):
这样,搜索Grambu或Grambú的用户将把搜索转换为Gramb[uú249;üú],并返回两个结果
需要注意的是,GLOB
忽略了COLLATE NOCASE
,这就是为什么我将函数和查询中的所有内容都转换为小写。还请注意,sqlite中的lower()
函数对非ASCII字符不起作用,但这些字符可能已经被替换了
该函数还用“转义”版本替换了
GLOB
通配符、*
和?
。感谢您的重播。我在任何地方都找不到“COLLATE LOCALE”。我所能找到的只是整理二进制、NOCASE和RTRIM。@RojilThomas抱歉,这是一个打字错误。编辑了我的答案。在title='Grambu'的情况下,COLLATE LOCALIZED对我有效,但当查询的标题类似于“%Grambu%”时,我无法得到结果。因此,我的理解是,这里的COLLATE不能与LIKE一起使用,我必须使用第二个标准化列。您好,我们需要在哪里使用它?
SELECT * from table WHERE lower(column) GLOB "*addTildeOptions(searchText)*"