За последние 24 часа нас посетили 21543 программиста и 1027 роботов. Сейчас ищут 690 программистов ...

Sqlite3 сортировка кириллицы

Тема в разделе "PHP и базы данных", создана пользователем antropoied, 8 дек 2019.

  1. antropoied

    antropoied Активный пользователь

    С нами с:
    8 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    При разработке приложения столкнулся со следующей проблемой. Имеется БД (SQLITE3) в которой хранятся названия фруктов и сортировка (по алфавиту) названий происходит по регистру, чтобы сделать регистронезависимую сортировку использовал COLLATE NOCASE, однако с кириллицей как выяснилось это не работает. Для php есть модуль интернационализации (Intl) - обёртка для библиотеки ICU, но вот как её использовать понять не могу (русскоязычной информации практически нет).

    Приложение крутится на XAMPP (Apache + PHP)

    PHP:
    1. $db = new SQLite3('basa.db');
    2. $prepare = $db->prepare("SELECT * FROM fruts ORDER BY name_frut COLLATE NOCASE");
    3. $result = $prepare->execute();
    4. $data = [];
    5. while ($res = $result->fetchArray(SQLITE3_ASSOC)) {
    6.    $data[] = $res;
    7. }
    8. $db->close() ;
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    для sqlite используй доп столбец с lower буквами, либо собери данные в массив и отсортируй в пхп скрипте
     
  3. antropoied

    antropoied Активный пользователь

    С нами с:
    8 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    Хотелось бы конечно без костылей, но видимо придётся сортировать на php
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Тут нет костылей, это sqlite
     
  5. antropoied

    antropoied Активный пользователь

    С нами с:
    8 авг 2018
    Сообщения:
    23
    Симпатии:
    0
    Всё разобрался
    PHP:
    1. function mysort($a, $b) {
    2. $col = new collator('ru_RU');
    3. $arr = array($a['name_frut'], $b['name_frut']);
    4. $col->asort($arr, SORT_NATURAL | SORT_FLAG_CASE);
    5. return array_pop($arr) == $a['name_frut'];
    6. }
    7. usort($data, 'mysort');