【问题标题】:Sort order in SQLite3 with umlautsSQLite3中带有变音符号的排序顺序
【发布时间】:2011-04-15 09:33:02
【问题描述】:

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

【问题讨论】:

    标签: python sqlite collation diacritics


    【解决方案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)
    

    请注意,尽管此排序规则可以正确处理 'ü' == 'Ü',但它仍然有 'ü' &gt; 'v',因为字母在大小写折叠后仍按 Unicode 代码点顺序排序。编写一个对德语友好的排序规则函数留给读者作为练习。或者更好的是,对于现有 Unicode 库的作者。

    此外,如果可能的话,我会 想知道如何申请 对已经进行了必要的修改 现有表!

    仅当您的索引使用您已覆盖的排序规则时,您才需要修改数据库。 Drop 该索引并重新create 它。

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

    【讨论】:

      【解决方案2】:

      一年前曾在此处询问过类似的question

      正如该问题的 OP 所述,答案对您来说可能有点矫枉过正。不过,我推荐 James Tauber 的 Unicode Collation Algorithm

      他的网页上有一个例子:

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

      【讨论】:

      • 谢谢,但我已经设法通过 python 对其进行排序。但我问是否可以从数据库中检索已经正确排序的数据(如 mysql 和 postgres)......
      • 我建议您使用主键编号重新设计您的数据库,确保以正确的顺序插入每个排序的对象。
      【解决方案3】:
      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")
      

      【讨论】:

        猜你喜欢
        • 2015-02-26
        • 2011-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-02
        相关资源
        最近更新 更多