3

实际上问题被问了好几次,但我没有找到答案。

有一组只读的 SQLite 表 - 我无法更改它们的结构或重新定义排序规则。包含一些国际字符(俄语/中文等)的表格。

我想获得一些不区分大小写的选择,例如:

select name from names_table where upper(name) glob "*"+constraint.toUpperCase()+"*"

它仅在namelatin/ASCII 字符集时有效,对于国际字符它不起作用。

SQLite 的手册内容如下:

upper(X) 函数返回输入字符串 X 的副本,其中所有小写 ASCII 字符都转换为大写等效字符。

所以问题是:如何解决这个问题并使国际字符大写/小写?

4

2 回答 2

5

这是 sqlite 中的已知问题。您可以通过 Android NDK 重新定义内置函数。这不是一个简单的方法。看看这个问题

请注意,您的表的索引将不起作用(对于 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)+"*"

此解决方案需要更多的数据空间,但它简单快捷。

于 2013-04-30T11:41:21.780 回答
1

默认情况下,SQLite 没有提供完整的 Unicode 大小写支持,而是提供了链接外部 Unicode 比较和转换例程的能力。应用程序可以重载内置 NOCASE 整理序列(使用sqlite3_create_collat​​ion())和内置 like()、upper() 和 lower() 函数(使用 sqlite3_create_function())。SQLite 源代码包含一个执行这些重载的“ICU”扩展。或者,开发人员可以根据他们自己的项目中已经包含的 Unicode 感知比较例程编写自己的重载。

参考: http ://www.sqlite.org/faq.html

于 2013-04-30T07:28:28.963 回答