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

时间:2011-10-18 20:10:05

标签: sqlite collation

在我的SQLite 3数据库中,我有一些土耳其字符的记录,如“Ö”,“Ü”,“İ”等。当我用SELECT * FROM TABLE ORDER BY COLUMN_NAME查询选择我的值时,以这些开头的记录人物即将到来。

通常情况下,他们应该来到每个字母的无点版本之后。就像“Ö”在“O”之后,“Ü”在“U”之后。

这是关于区域设置的吗?有没有办法控制这些设置?

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

提前致谢。

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

2 个答案:

答案 0 :(得分:2)

不幸的是,似乎没有直接解决方案。至少对于iOS。但是有很多方法可以效仿。

在订阅了SQLite的邮件列表后,用户名为Jean-Christophe Deschamps的回复是:

  

“在我的SQLite 3数据库中,我有一些土耳其字符的记录   例如“Ö”,“Ü”,“İ”等。当我用'SELECT * FROM选择我的值时   表单按COLUMN_NAME的查询顺序,以这些开头的记录   人物即将到来。“

     

裸骨SQLite仅在较低的ASCII字符集上正确整理。   虽然这对普通英语来说很好,但对我们大多数人来说并不适用。

     

“通常情况下,他们应该来到无点字母之后   每个版本。就像“Ö”在“O”之后,“Ü”在“U”之后。是吗   有关区域设置的事情?有没有办法控制这些   设置?“

     

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

     

o)使用ICU作为扩展(对于第三方管理者)或   链接到       你的申请。       优点:它在每个语言中一次对于给定语言100%正确地工作                   操作。       缺点:它是巨大而缓慢的,它需要你注册一个整理       你处理的每种语言。它也不适用于列       包含几种非英语语言。

     

o)编写自己的排序规则,调用您的OS'ICU例程   勘       字符串。       优点:不会使用庞大的库膨胀您的代码。       缺点:要求你写这个扩展(用C或其他东西),相同                   ICU的其他缺点。

     

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

     

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

     

我的小扩展程序将适用于此。你可能也想   尝试内置ICU的SQLite Expert(至少在其Pro版本中)   和很多更多。

答案 1 :(得分:0)

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