使用变音符号在SQLite3中对顺序进行排序

时间:2010-09-21 19:42:02

标签: python sqlite collation diacritics

我正在使用sqlite数据库,使用python / django。我需要得到我的结果,其中包含德语变音符号(ä,ö,ü)才能正确排序(不是最后的变音符号)。在网上阅读不同的文章我甚至不确定它是否可能。 因此,任何建议/指示都表示赞赏。我已经研究了create_collation等的文档,但我找不到任何有用的“初学者”示例。此外,如果可能的话,我想知道如何对已有的表格进行必要的修改!

3 个答案:

答案 0 :(得分:2)

1年前在这里问了一个类似的question

如该问题的OP所述,答案对你来说可能有些过分。不过,我确实推荐James Tauber的Unicode Collation Algorithm

一个例子就在他的网页上:

from pyuca import Collator

c = Collator("allkeys.txt") 
sorted_words = sorted(words, key=c.sort_key)

答案 1 :(得分:1)

  

所以任何建议/指示都是   赞赏。我已经研究过了   create_collat​​ion等的文档,但我   找不到任何有用的例子   “初学者”。

要使用sqlite3创建排序规则,您需要一个与C strcmp类似的功能。

def stricmp(str1, str2):
    str1 = str1.lower()
    str2 = str2.lower()
    if str1 == str2:
        return 0
    elif str1 < str2:
        return -1
    else:
        return 1

db = sqlite3.connect(':memory:')
# SQLite's default NOCASE collation is ASCII-only
# Override it with a (mostly) Unicode-aware version
db.create_collation('NOCASE', stricmp)

请注意,尽管此排序规则将正确处理'ü' == 'Ü',但它仍然会有'ü' > 'v',因为在翻译大小写后字母仍按Unicode代码点顺序排序。编写德语友好的校对功能留给读者练习。或者更好的是,对于现有Unicode库的作者。

  

此外,如果有可能,我会   想知道如何申请   必要的修改已经   现有的桌子!

如果您的索引使用了已覆盖的排序规则,则只需修改数据库。 Drop该索引并重新create它。

请注意,具有UNIQUE(或PRIMARY KEY)约束的任何列都将具有隐式索引。

答案 2 :(得分:0)

import locale
locale.setlocale(locale.LC_ALL, 'cs_CZ.utf8')
con = sqlite3.connect(....)
con.create_collation("czech", locale.strcoll)
cur = con.cursor()
cur.execute("select name from people order by name collate czech")