SQLite 3:按记录排序时的字符问题

Posted

技术标签:

【中文标题】SQLite 3:按记录排序时的字符问题【英文标题】:SQLite 3: Character Issue While Ordering By Records 【发布时间】:2011-12-10 09:57:40 【问题描述】:

在我的 SQLite 3 数据库中,我有一些带有土耳其字符的记录,例如“Ö”、“Ü”、“İ”等。当我使用 SELECT * FROM TABLE ORDER BY COLUMN_NAME 查询选择我的值时,以这些字符开头的记录是到了最后。

通常,它们应该出现在每个无点版本的字母之后。就像“Ö”在“O”之后,“Ü”在“U”之后。

与区域设置有关吗?有没有办法控制这些设置?

我在 Firefox 中使用 SQLite Manager 来管理我的数据库。

提前致谢。

附:我知道这不是 SQLite 的解决方案,但对于那些需要在 Objective-C 中使用 SQLite DB 的人来说,他们可以在从 SQLite DB 获取数据后对数据数组进行排序。这是一个很好的解决方案:How to sort an NSMutableArray with custom objects in it?

【问题讨论】:

我没有用 SQLite 做过任何这些,但也许这会有所帮助:sqlite.org/datatype3.html#collation 如果有,我会看看并返回这里。非常感谢。 您可以启用SQLite "ICU" extension 以使用重音字符进行正确排序。 My answer here 详细说明了如何在基于 Debian 的系统上进行操作。 【参考方案1】:

不幸的是,似乎没有直接的解决方案。至少对于 ios。但是有一些方法可以遵循。

在我订阅了 SQLite 的邮件列表后,名叫 Jean-Christophe Deschamps 的用户回复了这个:

"在我的 SQLite 3 数据库中,我有一些带有土耳其字符的记录 例如“Ö”、“Ü”、“İ”等。当我使用 'SELECT * FROM 选择我的值时 TABLE ORDER BY COLUMN_NAME' 查询,以这些开头的记录 字符在最后。”

Bare bone SQLite 仅在较低的 ASCII 字符集上正确排序。 虽然这对于简单的英语来说很好,但对我们大多数人来说并不适用。

“通常,它们应该出现在没有点的字母之后 每个版本。就像“Ö”在“O”之后,“Ü”在“U”之后。是吗 关于区域设置?有没有办法控制这些 设置?”

您可以选择一些方法来使其正确或接近正确 对于您的语言:

o) 将 ICU 用作扩展(用于第三方经理)或 链接到 你的申请。 优点:对于给定的语言,它每次都能 100% 正确工作 手术。 缺点:它又大又慢,需要你注册一个排序规则 您处理的每种语言。它也不适用于列 包含几种非英语语言。

o) 编写您自己的排序规则,调用您操作系统的 ICU 例程以 整理 字符串。 优点:不会用庞大的库使您的代码膨胀。 缺点:需要你写这个扩展(用 C 或其他东西),同样 ICU 的其他缺点。

o) 如果您使用 Windows,请下载并使用 扩展我 写了一个接近正确的结果。 优点:它体积小,速度相当快,可以立即使用,它是语言- 独立但适用于许多语言 同时;它还提供了许多 Unicode 感知 字符串操作函数(不重音或不重音)函数, 模糊搜索功能等等。作为 C 源和 x86 DLL,免费用于任何目的。 缺点:对于使用的任何语言,它可能无法 100% 正确工作 不仅仅是“香草英文字母”:你的无点我会整理 例如,沿着虚线 i。这是一个很好的妥协 一种语言的绝对正确性和“公平”的正确性 大多数语言(包括一些使用变音符号的亚洲语言) 下载:http://dl.dropbox.com/u/26433628/unifuzz.zip

“我在 Firefox 中使用 SQLite Manager 来管理我的数据库。”

我的小扩展将与这个一起使用。您可能还想 尝试内置 ICU 的 SQLite Expert(至少在其 Pro 版本中) 还有更多

【讨论】:

感谢您的回答!不过上面的 Dropbox 链接已经失效了。【参考方案2】:

可能是区域设置,但首先我会验证是否使用了 UTF-8 编码。

【讨论】:

谢谢;我确实验证过,它是 UTF-8。

以上是关于SQLite 3:按记录排序时的字符问题的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 按日期排序1530019888000

从sqlite按日期升序对列表进行排序

Sqlit--学习教程(简介)

sqlit3事务

Android SQLit数据库学习

如何在搜索栏中按名字和姓氏排序 - Sqlite