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