Как отсортировать текст в sqlite3 с указанной локалью?

Вам нужен $ replaceRoot этап конвейера, попробуйте:

db.col.aggregate([ { $replaceRoot: { newRoot: "$a.b" } } ])

15
задан George Kagan 6 November 2016 в 19:44
поделиться

3 ответа

SQLite поддерживает интеграцию с ICU. Согласно файлу Readme, sqlite/ext/icu/README.txt sqlite/ext/icu/ каталог содержит исходный код для расширения "ICU" SQLite, интеграции библиотеки "International Components for Unicode" с SQLite.

1. Features

    1.1  SQL Scalars upper() and lower()
    1.2  Unicode Aware LIKE Operator
    1.3  ICU Collation Sequences
    1.4  SQL REGEXP Operator
13
ответ дан 1 December 2019 в 01:00
поделиться

Я принял ответ Doug Currie, но я хочу добавить некоторый "алгоритм", как сделать это, потому что sqlite3 документация является очень странной (по крайней мере, для меня).

хорошо, у нас есть работа sqlite3 и теперь:

  1. расширение ICU Загрузки для Компиляции sqlite

  2. это:

    gcc -shared icu.c `icu-config --ldflags` -o libSqliteIcu.so
    

    Это для Linux. Я также должен был установить дополнительный пакет разработки ICU:

    sudo apt-get install libicu-dev
    

    я работаю над архитектурой на 64 бита, и я получаю ошибку с __relocation R_X86_64_32S__ (независимо от того, что это означает:). GCC предложил добавить -fPIC для компиляции опций, и он помог.

  3. Выполнение sqlite3. Мы можем загрузить расширение командой:

    .load './libSqliteIcu.so'
    

    Предположение, что это находится в текущем каталоге, мы можем также определить целый путь.

  4. Создают новое сопоставление:

    SELECT icu_load_collation('pl_PL', 'POLISH');
    

    первый параметр является желаемой локалью, и второе, это (это может быть что).

  5. Теперь мы можем отсортировать данные с нашей новой локалью:

    SELECT * FROM some_table ORDER BY name COLLATE POLISH;
    

    И это нечувствительно к регистру!

26
ответ дан 1 December 2019 в 01:00
поделиться

Поскольку Doug Currie ответил, приказав, чтобы символы с диакритикой правильно могли быть включены путем загрузки расширение "ICU" SQLite

, расширение должно быть скомпилировано, как объяснено в собственном ответе kiew здесь. Однако название библиотеки, данное в ICU readme файл и в ответе kiew, не работало на меня. Этот другой ответ предложил использовать имя libicu.so вместо этого.

, Таким образом, это - то, что работало на меня на Ubuntu 16.04 и на Фрагменте Debian 9.8:

sudo apt install libicu-dev libsqlite3-dev dpkg-dev gcc make
apt-get source sqlite3
cd sqlite3-*/ext/icu       # assuming you have only 1 sqlite3 source directory
gcc -shared icu.c `icu-config --ldflags` -fPIC -o libicu.so
sudo cp libicu.so /usr/local/lib/
sudo ldconfig

После этого в sqlite3, Вы можете

.load libicu
SELECT icu_load_collation('', 'ICU');

, Этими 2 аргументами icu_load_collation является локаль и пользовательское имя. Локаль, кажется, является дополнительной и может быть оставлена пустой. Пользовательское имя затем видимо с [1 112]

PRAGMA collation_list;

, И оно может использоваться в качестве в [1 113]

SELECT col FROM tbl ORDER BY col COLLATE ICU;
0
ответ дан 1 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: