Итак, сегодня я постараюсь ответить на популярную проблему как пропатчить 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
Отойдя от шока, я полез в гугл, искать рецепт лечения сего безобразия. Его я вам и предлагаю:
- Для начала необходимо пропатчить
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
- Но на это проблема не закончилась. Если у вас PostgreSQL инициализирован в кодировке отличной от ru_RU.UTF-8, то этого патча будет недостаточно. Необходимо будет провести переинициализацию БД (что меня, конечно, абсолютно не обрадовало).
- Делаем дамп нашей базы (pg_dump или pg_dumpall).
- Останавливаем PostgresSQL:
/usr/local/etc/rc.d/postgresql stop
- В файл /etc/login.conf добавляем следующие строчки:
postgres:\
:lang=ru_RU.UTF-8:\
:setenv=LC_COLLATE=C:\
:tc=default:
- В файл /etc/rc.conf добавляем флаг для правильной инициализации:
postgresql_initdb_flags="--locale=ru_RU.UTF-8″
- Инициализируем базу:
/usr/local/etc/rc.d/postgresql initdb
- Заливаем обратно нашу базу. Вуаля!
И еще несколько комментариев по поводу...
- Баян судя по всему достаточно старый, поскольку тикету по данной проблеме не так давно исполнилось 2 года
. А первые упоминания датируются вообще 2005 годом.
- Скорость
К сожалению скорость сортировки строк UTF-8 с применением данного патча в 10 раз медленнее чем, например, сортировка в локале ru_RU.KOI8-R, и почти в 30 раз медленнее чем в локале С.