java - 使用 LIKE 语句的 SQLite 大小写重音

标签 java android sqlite

我将这 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 而不是两个 Ágata。

这里有什么问题? upper() 函数不应该使它在两侧完全相同并返回 AntónioÁgata 吗?

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

最佳答案

根据SQLite documentation , 关于 LIKE 子句:

Any other character matches itself or its lower/upper case equivalent (i.e. case-insensitive matching).

但是那里有一个错误注释:

SQLite only understands upper/lower case for ASCII characters by default. The LIKE operator is case sensitive by default for unicode characters that are beyond the ASCII range. For example, the expression 'a' LIKE 'A' is TRUE but 'æ' LIKE 'Æ' is FALSE

因此,您可能必须省略 upper 子句,并通过在 where 子句中添加 or 大小写来处理非 ASCII 字符的大写。

select _id, display_name from raw_contacts 
where 
    ((display_name like '%antó%') or
    (display_name like '%antÓ%'))

关于java - 使用 LIKE 语句的 SQLite 大小写重音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23870565/

相关文章:

sqlite查询以获取所有表名列表及其中的记录数

java - Redis中的notify-keyspace-events是什么

java - 如何限制 SAX 解析器处理程序类中调用 'startElement()' 的次数?

android - 将 JSON 解析为 ListView 友好的输出

android - React Native - Play 商店警告 "Starting May 5th you must let us know why your app requires broad storage access"

iOS 8 - 带有未知错误的 sqlite。

java - 通过套接字连接在 Java 中处理字节流

java - java中如何编译异常

Android 动态 RadioGroup/RadioButtons 作为平面按钮

sql - 测试引用行的相等性