SQLite Order By将umlauts和特殊字符放在末尾。

4

我正在使用Phonegap为iOS开发一个词典应用程序。

当查询数据库以获取字母顺序列表时,我使用COLLATE NOCASE

ORDER BY term COLLATE NOCASE ASC

这解决了一个问题,即以小写字母开头的术语被附加到末尾(从那个问题中学到的)。

但是非标准字符如öäüéêè仍然最后排序~这里有两个例子:

    Expected: Öffnungszeiten     Oberved: Zuzahlung
              Zuzahlung                   Öffnungszeiten

(or)          clé                         cliquer sur
              cliquer sur                 clé

我搜索了一下,发现有类似的问题在这里讨论,或者在这里 讨论,但是似乎通常建议安装某种类型的扩展。

这个扩展可能会帮助您...

...使用ICU作为扩展程序

SQLite支持与ICU集成...

但是我不确定这是否适用于我的情况,因为数据库不是由我自己托管而是运行在客户设备上。所以我猜我需要在我的应用程序包中捆绑这个扩展。
我对iOS不太熟悉,但我感觉这可能会很麻烦 - 至少。

另外,在官方论坛中,我找到了以下提示:

SQLite does not properly handle accented characters.

在文本中稍微往下,海报提到了SQLite的一个bug。

我找到的所有链接都已经不再活跃了1年或更长时间,而且其中没有任何一个似乎是处理我目前正在开发的移动环境的。
因此,我想知道是否有其他人在他们的iOS项目中找到了解决方案。

文档说明它们只有3个默认排序选项:

6.0 Collating Sequences

When SQLite compares two strings, it uses a collating sequence or collating function (two words for the same thing) to determine which string is greater or if the two strings are equal. SQLite has three built-in collating functions: BINARY, NOCASE, and 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

comparison is performed. Note that only ASCII characters are case folded. SQLite does not attempt to do full UTF case folding due to the size of the tables required. RTRIM - The same as binary, except that trailing space characters are ignored.

目前我的最佳猜测是使用JavaScript进行排序,但我怀疑这对整体性能不会有什么好处。


如何将SQLite编译到您的应用程序中? 您知道ICU包含在合并中吗? - CL.
1个回答

2
原因是iOS上的SQLite没有启用ICU(国际Unicode组件)。因此,您需要构建自己的SQLite版本并启用ICU+自己的ICU版本作为静态库+添加ICU.dat并使SQLite加载此.dat文件。然后,您可以通过简单的SQL命令(即“icu_load_collation(“de_DE”,“DEUTSCH”)”,在打开数据库后执行一次)加载任何排序方式。

这不仅听起来很繁琐,实际上也确实如此。尝试找到已经完成所有工作的SQLite + ICU版本。


你知道iOS 7默认是否已经有ICU,还是这个问题仍然存在吗? - Kozuch
@benjist 很抱歉接受了这个答案。我想我们只是标记了这个错误,然后继续前进。 :) - nuala
@Kozuch 快速搜索带我到了这里 https://dev59.com/zGsz5IYBdhLWcg3wFT4f,其中包含一些关于如何构建自己的信息。正如我所提到的,我们没有走这条路,而且我周围也没有iPhone可以使用了 *欢快跳舞* 但为什么不在模拟器中尝试一下 - 或许现在已经修复了呢? - nuala
不,它仍未编译到iOS 7附带的SQLite中。说实话,我能理解苹果公司。他们肯定会在CoreData中使用全文搜索和排序,但由于FTS API真的很愚蠢,我也不会将这个混乱的东西合并到除了低级库('pcnxla'和不同的fts数据指针偏移信息,没有标记编号-只有内部人员)之外的任何东西中。 - benjist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接