我的 Android 联系人列表中存储了这 4 个联系人,它是一个 SQLite 数据库。
António Meireles
AntÓnio Pinto
Ágata Silva
ágata Pereira
如果我执行:
select _id, display_name from raw_contacts where upper(display_name) like upper('%antó%')
我得到了
António Meireles
,但不是安东尼奥斯。
如果我执行:
select _id, display_name from raw_contacts where upper(display_name) like upper('%á%')
我得到
ágata Pereira
,但不是两个Ágatas。
这里出了什么问题?
upper()
函数不应该使其两侧完全相同并返回António
和Ágata
吗?
当我尝试在重音符号出现时使搜索不区分大小写时,就会发生这种情况。根据我阅读的内容,建议将两者(比较器和要比较的字符串)都放在大写或小写中,并且两个字符串都会匹配,但在我的情况下不会发生这种情况。
根据SQLite文档,关于LIKE子句:
任何其他字符与其自身或其小写/大写等效字符匹配 (即不区分大小写的匹配)。
但是有一个错误注释:
SQLite 仅理解 ASCII 字符的大写/小写 默认。对于 unicode,LIKE 运算符默认区分大小写 超出 ASCII 范围的字符。例如, 表达式 'a' LIKE 'A' 为 TRUE,但 'æ' LIKE 'Æ' 为 FALSE
因此,您可能必须省略 upper 子句,并通过在 where 子句中添加 or 大小写来处理非 ASCII 字符的大写字母。
即
select _id, display_name from raw_contacts
where
((display_name like '%antó%') or
(display_name like '%antÓ%'))
一个有用的替代方法是在 SQL 中用“_”替换这些重音字符:
select _id, display_name from raw_contacts where upper(display_name) like upper('%ant_%')