SQLite upper()类似于国际字符的功能

时间:2013-04-30 06:20:43

标签: android localization sqlite internationalization

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

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

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

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

仅当name是拉丁语/ ASCII字符集时才有效,对于国际字符,它不起作用。

SQLite手册上写着:

  

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

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

2 个答案:

答案 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_collat​​ion())和内置的like(),upper()和lower()函数(使用sqlite3_create_function())。 SQLite源代码包含执行这些重载的“ICU”扩展。或者,开发人员可以根据他们自己的项目中已包含的Unicode感知比较例程来编写自己的重载。

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