SQLite Order By将变音符号和特殊字符放在末尾

sxpgvts3  于 2023-02-16  发布在  SQLite
关注(0)|答案(1)|浏览(190)

我正在用Phonegap做一个iOS版的字典应用程序。
在查询数据库中的字母列表时,我使用COLLATE NOCASE

ORDER BY term COLLATE NOCASE ASC

这解决了以小写字母开头的术语附加到末尾的问题(从that question中选取)。
然而,非标准字符,如öäüéêè,仍然会在最后排序~这里有2个例子:

Expected: Öffnungszeiten     Oberved: Zuzahlung
              Zuzahlung                   Öffnungszeiten

(or)          clé                         cliquer sur
              cliquer sur                 clé

我环顾四周,发现类似的问题讨论herehere,但似乎一般的建议是安装某种类型的扩展
此扩展可能会帮助您...
...将ICU用作分机
SQLite支持与ICU集成...
但我不确定这是否适用于我的情况,数据库不是由我自己托管的,而是在客户的设备上运行的,所以我想我会把这个扩展包和我的应用程序包一起发货。
我不太熟悉iOS,但我有一种感觉,那将是复杂的-至少。
同样在the official forum中,我发现了这个提示:

SQLite does not properly handle accented characters.

在正文的下面,海报提到了SQLite中的一个bug。
我发现所有的链接都已经超过1年没有活动了,而且没有一个链接可以处理我目前正在开发的移动环境。
所以我想知道是否还有人在他们的iOS项目上找到了解决方案。
文档指出它们只有3个默认的COLLATION选项:
6.0校对顺序
当SQLite比较两个字符串时,它使用排序序列或排序函数(两个单词表示同一个东西)来确定哪个字符串更大或两个字符串是否相等。SQLite有三个内置排序函数:二进制、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中进行排序,但我怀疑这对整体性能没有什么好处。

j5fpnvbx

j5fpnvbx1#

原因是iOS上的SQLite没有ICU(Unicode的国际组件)。因此,您需要构建自己的启用ICU的SQLite版本+自己的ICU版本作为静态库+添加ICU.dat并使SQLite加载此.dat文件。然后,您可以通过简单的SQL命令加载任何排序规则(即“icu_load_collation(“de_DE”,“多伊奇”)“,数据库打开后一次)
这不仅听起来像是一项肮脏的工作,它确实是。尝试找到一个版本的SQLite + ICU与所有这一切都已经完成。

相关问题