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:按记录排序时的字符问题的主要内容,如果未能解决你的问题,请参考以下文章