Порядок сортировки в SQLite3 с умлаутами

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


person Bernhard Vallant    schedule 21.09.2010    source источник


Ответы (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) будет иметь неявный индекс.

person dan04    schedule 21.09.2010