SQLite顺序通过放置变音符号和特殊字符结束

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

当查询数据库的字母表列表我使用COLLATE NOCASE

 ORDER BY term COLLATE NOCASE ASC 

这解决了这个问题,即以小写字母开头的术语(附加到最后)。

然而,非标准字符öäüéêè最后仍然得到sorting〜这里有两个例子:

  Expected: Öffnungszeiten Oberved: Zuzahlung Zuzahlung Öffnungszeiten (or) clé cliquer sur cliquer sur clé 

我环顾四周,发现类似的问题在这里或这里讨论,但似乎一般的build议是安装某种types的扩展

这个扩展可能可以帮助你…

…使用ICU作为扩展

SQLite支持与ICU集成…

但我不知道这是否适用于我的情况下数据库不是由我自己托pipe,但在客户端设备上运行。 所以我想我会把这个扩展w /我的应用程序包。
我对iOS不是很熟悉,但是我觉得这个感觉很复杂 – 至less。

另外在官方论坛中,我发现这个提示:

 SQLite does not properly handle accented characters. 

并在文本中一点点的海报提到SQLite中的错误。

我发现的所有链接都没有被激活,但是它们中的一些似乎并没有处理我正在开发的移动环境。
所以我想知道是否有人在他们的iOS项目上find了解决scheme。

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

6.0整理序列

当SQLite比较两个string时,它使用一个整理序列或整理函数(两个词用于同一事物)来确定哪个string更大或者两个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中进行sorting,但是我怀疑这对整体性能没有什么好处。

原因是iOS上的SQLite没有启用ICU。 所以你需要build立你自己的启用ICU的SQLite版本+你自己的ICU版本作为静态lib +添加ICU .dat,并使SQLite加载这个.dat文件。 然后你可以通过一个简单的SQL命令加载任何sorting规则(例如,'dbu'打开后'icu_load_collat​​ion(“de_DE”,“DEUTSCH”))

它不仅听起来像是污垢的工作,它确实是。 试着find一个已经完成的SQLite + ICU版本。