我将这4个联系人存储在我的android联系人列表中,它是一个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
而不是全部都是Antónios。如果我执行:
select _id, display_name from raw_contacts where upper(display_name) like upper('%á%')
我得到
ágata Pereira
而不是两个Ágatas。怎么了
upper()
函数不应该使它在两侧完全相同,并同时返回António
和Ágata
吗?当我尝试使重音符号变得不区分大小写时,这种情况发生在我身上。根据我的阅读情况,建议将(比较器和要比较的字符串)都使用大写或小写,并且两个字符串都应匹配,但这在我的情况下不会发生。
最佳答案
根据SQLite documentation,关于LIKE子句:
任何其他字符匹配其自身或等效的小写/大写字母
(即,不区分大小写的匹配)。
但是这里有一个错误注释:
SQLite仅通过以下方式理解ASCII字符的大小写
默认。默认情况下,LIKE运算符对Unicode区分大小写
ASCII范围之外的字符。例如,
表达式'a'喜欢'A'为TRUE,但'æ'喜欢'Æ'为FALSE
因此,可能您必须省略where子句,并通过在where子句中添加或case来处理非ASCII字符的大写字母。
即
select _id, display_name from raw_contacts
where
((display_name like '%antó%') or
(display_name like '%antÓ%'))