代码之家  ›  专栏  ›  技术社区  ›  Bernhard Vallant

SQLite3中带元音的排序顺序

  •  4
  • Bernhard Vallant  · 技术社区  · 14 年前

    create_collation

    3 回复  |  直到 14 年前
        1
  •  2
  •   dan04    14 年前

    有什么建议/指示吗 用于创建\u排序等的文档,但我 “初学者”。

    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库的作者提交。

    此外,如果可能的话,我会 想知道如何应用 已对进行了必要的修改

    如果索引使用已重写的排序规则,则只需修改DB。 Drop 那个索引和re- create 是的。

    请注意,任何带有 UNIQUE PRIMARY KEY

        2
  •  2
  •   Community Egal    7 年前

    question 一年前被问到这里。

    答案对你来说可能是过分的,正如问题的开头所说的那样。不过,我还是推荐詹姆斯·陶伯的 Unicode Collation Algorithm

    他的网页上有一个例子:

    from pyuca import Collator
    
    c = Collator("allkeys.txt") 
    sorted_words = sorted(words, key=c.sort_key)
    
        3
  •  0
  •   mirek    8 年前
    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")