SQLite 使用 LIKE 语句区分大小写

问题描述 投票:0回答:2

我的 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
吗?

当我尝试在重音符号出现时使搜索不区分大小写时,就会发生这种情况。根据我阅读的内容,建议将两者(比较器和要比较的字符串)都放在大写或小写中,并且两个字符串都会匹配,但在我的情况下不会发生这种情况。

java android sqlite
2个回答
3
投票

根据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Ó%'))

0
投票

一个有用的替代方法是在 SQL 中用“_”替换这些重音字符:

select _id, display_name from raw_contacts where upper(display_name) like upper('%ant_%')
© www.soinside.com 2019 - 2024. All rights reserved.