Pull to refresh

Патчим UTF-8 Collation под FreeBSD

Reading time2 min
Views5.7K
Итак, сегодня я постараюсь ответить на популярную проблему как пропатчить KDE UTF-8 под FreeBSD.

В один прекрасный момент переноса базы данных с тестового сервера на продакшн для подготовки бета версии я больно стукнулся головой об проблему с UTF-8 строками в PostgreSQL. А точнее, натолкнулся на полное нежелание PostgreSQL выдавать на запрос SELECT upper('суслик') положенного по штату "СУСЛИК"а. В результате поиска баги я был в шоке, так как совсем не ожидал от современной операционки таких, совсем уже детских, ляпов!

PostgreSQL собранный из портов во фряхе для работы с юникодными строками использует системный LC_COLLATE. Для того чтобы понять в чем грабля мне понадобилась всего одна команда:

$ ls -l /usr/share/locale/ru_RU.UTF-8/LC_COLLATE
lrwxr-xr-x  1 root  wheel  28 Dec  3 23:30 /usr/share/locale/ru_RU.UTF-8/
LC_COLLATE -> ../la_LN.US-ASCII/LC_COLLATE

Отойдя от шока, я полез в гугл, искать рецепт лечения сего безобразия. Его я вам и предлагаю:

  1. Для начала необходимо пропатчить KDE UTF-8 под FreeBSD (мои благодарности автору решения):

    wget http://blog.lexa.ru/files/ru_RU.UTF-8.LC_COLLATE.tar.gz
    tar xzvf ru_RU.UTF-8.LC_COLLATE.tar.gz
    cd ru_RU.UTF-8.LC_COLLATE
    make freebsdsort или make universal
    su
    make install
    

  2. Но на это проблема не закончилась. Если у вас PostgreSQL инициализирован в кодировке отличной от ru_RU.UTF-8, то этого патча будет недостаточно. Необходимо будет провести переинициализацию БД (что меня, конечно, абсолютно не обрадовало).
  3. Делаем дамп нашей базы (pg_dump или pg_dumpall).
  4. Останавливаем PostgresSQL:

    /usr/local/etc/rc.d/postgresql stop
    

  5. В файл /etc/login.conf добавляем следующие строчки:

    postgres:\
    :lang=ru_RU.UTF-8:\
    :setenv=LC_COLLATE=C:\
    :tc=default:
    

  6. В файл /etc/rc.conf добавляем флаг для правильной инициализации:

    postgresql_initdb_flags="--locale=ru_RU.UTF-8"
    

  7. Инициализируем базу:

    /usr/local/etc/rc.d/postgresql initdb
    

  8. Заливаем обратно нашу базу. Вуаля!

И еще несколько комментариев по поводу…

  • Баян судя по всему достаточно старый, поскольку тикету по данной проблеме не так давно исполнилось 2 года :). А первые упоминания датируются вообще 2005 годом.
  • Скорость :( К сожалению скорость сортировки строк UTF-8 с применением данного патча в 10 раз медленнее чем, например, сортировка в локале ru_RU.KOI8-R, и почти в 30 раз медленнее чем в локале С.

PS Кросспост из личного блога.
Tags:
Hubs:
+6
Comments21

Articles