Я работаю с базой данных sqlite, используя python/django. Мне нужно, чтобы мои результаты, содержащие немецкие умляуты (ä, ö, ü), были правильно отсортированы (не с умлаутами в конце). Читая разные статьи в Интернете, я даже не уверен, возможно это или нет. Поэтому любые советы/инструкции по этому поводу приветствуются. Я уже изучил документы для create_collation
и т. д., но не смог найти полезных примеров для "новичков". Кроме того, если это возможно, я хотел бы знать, как применить необходимые модификации к уже существующим таблицам!
Порядок сортировки в SQLite3 с умлаутами
Ответы (2)
Поэтому любые советы/инструкции по этому поводу приветствуются. Я уже изучил документы для create_collation и т. д., но не смог найти полезных примеров для «новичков».
Чтобы создать сопоставление с sqlite3
, вам нужна функция, которая работает как 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
) будет иметь неявный индекс.
Аналогичный вопрос был задан здесь 1 год назад.
Ответ может быть излишним для вас, как указано в ОП этого вопроса. Однако я рекомендую .
Пример прямо на его веб-странице:
from pyuca import Collator
c = Collator("allkeys.txt")
sorted_words = sorted(words, key=c.sort_key)