Итак, сегодня я постараюсь ответить на популярную проблему как пропатчить KDE UTF-8 под FreeBSD.
В один прекрасный момент переноса базы данных с тестового сервера на продакшн для подготовки бета версии я больно стукнулся головой об проблему с UTF-8 строками в PostgreSQL. А точнее, натолкнулся на полное нежелание PostgreSQL выдавать на запрос SELECT upper('суслик') положенного по штату "СУСЛИК"а. В результате поиска баги я был в шоке, так как совсем не ожидал от современной операционки таких, совсем уже детских, ляпов!
PostgreSQL собранный из портов во фряхе для работы с юникодными строками использует системный LC_COLLATE. Для того чтобы понять в чем грабля мне понадобилась всего одна команда:
Отойдя от шока, я полез в гугл, искать рецепт лечения сего безобразия. Его я вам и предлагаю:
И еще несколько комментариев по поводу…
PS Кросспост из личного блога.
В один прекрасный момент переноса базы данных с тестового сервера на продакшн для подготовки бета версии я больно стукнулся головой об проблему с 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
Отойдя от шока, я полез в гугл, искать рецепт лечения сего безобразия. Его я вам и предлагаю:
- Для начала необходимо пропатчить
KDEUTF-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 раз медленнее чем в локале С.
PS Кросспост из личного блога.