2013-04-30 42 views
3

其实问题曾多次提出过,但我无法找到答案。用于国际字符的SQLite upper()相似的功能

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

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

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

它的工作原理,只有当name是拉丁/ ASCII字符,国际字符它不工作。

SQLite的手册如下:

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

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

回答

5

这在源码公知的问题。您可以通过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)+"*" 

这种解决方案需要用于数据更多的空间,但它是简单和快速的。

+0

我的表是只读的 - 我无法修改它们的结构 – barmaley 2013-04-30 11:54:12

+0

您可以将其他数据库与所需的表和列一起使用,并将此数据库附加到原始数据库。然而,在这种情况下,同步的过程将更加复杂。 – matreshkin 2015-03-03 09:13:20

+0

@matreshkin嗨!你可以更具体的toAsciiEquivalent()方法实现吗?也许一些代码示例?我是否也可以和LIKE语句一起使用? – AlexKost 2015-08-13 13:20:33

1

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

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

+0

Thanx for reply。但如何在Java/Android中实现它?考虑到原始表格只能读取?我真的很感谢你的帮助 – barmaley 2013-04-30 09:14:07

+0

我喜欢这样做,但我是一名C++程序员,对Java有较少的了解。 – 2013-04-30 09:43:46