我将这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Ó%'))

10-04 23:06
查看更多