Порядок сортировки в SQLite3 с умлаутами - PullRequest
4 голосов
/ 21 сентября 2010

Я работаю с базой данных sqlite, используя python / django. Мне нужно иметь результаты, которые содержат немецкие умлауты (ä, ö, ü), чтобы они были правильно отсортированы (не с умлаутами в конце). Читая различные статьи в Интернете, я даже не уверен, возможно ли это или нет. Так что любые советы / инструкции по этому поводу приветствуются. Я уже изучил документы для create_collation и т. Д., Но не смог найти полезных примеров для «новичков». Кроме того, если это возможно, я хотел бы знать, как применить необходимые изменения к уже существующим таблицам!

Ответы [ 3 ]

2 голосов
/ 22 сентября 2010

Подобный вопрос задавался здесь 1 год назад.

Ответ может быть для вас излишним, как указано в ОП этого вопроса. Однако я рекомендую алгоритм сортировки Unicode Джеймса Таубера .

Пример прямо на его веб-странице:

from pyuca import Collator

c = Collator("allkeys.txt") 
sorted_words = sorted(words, key=c.sort_key)
1 голос
/ 22 сентября 2010

Так что любые советы / инструкции по этому поводу оценили. Я уже изучала документы для create_collation и т. д., но я не смог найти полезных примеров для "новички".

Чтобы создать сопоставление с sqlite3, вам нужна функция, которая работает как C's 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) будет иметь неявный индекс.

0 голосов
/ 19 мая 2016
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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...