实际上问了几次问题,但我没有设法找到答案。
有一组只读的SQLite表 - 我无法更改其结构或重新定义整理规则。表包含一些国际字符(俄语/中文等)。
我想得到一些不区分大小写的选择,如:
select name from names_table where upper(name) glob "*"+constraint.toUpperCase()+"*"
仅当name
是拉丁语/ ASCII字符集时才有效,对于国际字符,它不起作用。
SQLite手册上写着:
upper(X)函数返回输入字符串X的副本,其中全部为 小写ASCII字符转换为大写字母 等效。
所以问题是:如何解决这个问题并以大写/小写形式制作国际字符?
答案 0 :(得分:5)
这是sqlite中的已知问题。您可以通过Android NDK重新定义内置函数。这不是一个简单的方法。看this question
请注意,表的索引不起作用(对于UDF),查询可能非常慢。
您可以将您的数据(您寻找的)存储在ascii格式的其他列中,而不是它。
例如:
"insert into names_table (name, name_ind) values ('"+name+"',"+"'"+toAsciiEquivalent(name)+"')"
name name_ind
----------------
Имя imya
Name name
ыыы yyy
并按列name_ind搜索字符串
select name from names_table where name_ind glob "*"+toAsciiEquivalent(constraint)+"*"
此解决方案需要更多数据空间,但它简单快捷。
答案 1 :(得分:1)
SQLite提供了链接外部Unicode比较和转换例程的能力,而不是默认提供完整的Unicode案例支持。应用程序可以重载内置的NOCASE整理顺序(使用 sqlite3_create_collation())和内置的like(),upper()和lower()函数(使用sqlite3_create_function())。 SQLite源代码包含执行这些重载的“ICU”扩展。或者,开发人员可以根据他们自己的项目中已包含的Unicode感知比较例程来编写自己的重载。