SQLite Order By放置变音符号和放大器。最后的特殊字符

时间:2013-02-13 09:46:30

标签: ios sqlite cordova sql-order-by

我正在使用Phonegap为iOS做一个字典应用。

当在数据库中查询按字母顺序排列的列表时,我使用COLLATE NOCASE

ORDER BY term COLLATE NOCASE ASC

这解决了以小写字母开头的术语附加到末尾的问题(从that question挑选出来)。

然而,作为öäüéêè的非标准字符仍然在最后排序〜这里有两个例子:

    Expected: Öffnungszeiten     Oberved: Zuzahlung
              Zuzahlung                   Öffnungszeiten

(or)          clé                         cliquer sur
              cliquer sur                 clé

我环顾四周,发现了类似的问题herehere,但似乎一般的建议是安装某种类型的扩展程序

  

此扩展程序可能对您有帮助......

     

...使用ICU作为扩展名

     

SQLite支持与ICU集成...

但我不确定这是否适用于数据库不是由我自己托管但在客户设备上运行的情况。所以我猜我会用我的app-package发送这个扩展名。
我对iOS不是很熟悉,但我觉得这种感觉很复杂 - 至少。

同样在the official forum我发现了提示:

SQLite does not properly handle accented characters.

在海报中提到了SQLite中的一个错误。

我发现的所有链接都没有激活> = 1年,而其中没有链接似乎处理我正在开发的移动环境。
所以我想知道是否有其他人在他们的iOS项目中找到了解决方案。

文档说明他们只有3个默认的COLLATION选项:

  

6.0整理序列

     

当SQLite比较两个字符串时,它使用整理顺序或   整理功能(同一事物的两个单词)来确定哪个   string更大或者两个字符串是否相等。 SQLite有三个   内置整理功能:BINARY,NOCASE和RTRIM。

BINARY - Compares string data using memcmp(), regardless of text encoding.
NOCASE - The same as binary, except the 26 upper case characters of ASCII are folded to their lower case equivalents before the
     

进行比较。请注意,只有ASCII字符才是大小写   折叠。 SQLite不会尝试执行完整的UTF大小写折叠   所需表格的大小。       RTRIM - 与二进制相同,但忽略尾随空格字符。

现在我最好的猜测是在JavaScript中进行排序,但我怀疑这对整体性能没有任何好处。

1 个答案:

答案 0 :(得分:1)

原因是iOS上的SQLite没有启用ICU。因此,您需要构建自己的SQLite版本,启用ICU +您自己的ICU版本作为静态lib +添加ICU .dat并使SQLite加载此.dat文件。然后你可以通过一个简单的SQL命令加载任何排序规则(即'icu_load_collat​​ion(“de_DE”,“DEUTSCH”)',在db打开后一次)

它不仅听起来像是污垢,它确实是。尝试找到已完成所有SQLite + ICU的版本。