После обновления FireBird появилась проблема с кодировкой CHARACTER SET WIN1251 is not installed.
В статье приводится решение проблемы с кодировкой при подключении к базе FireBird на сервере с ОС FreeBSD.
Установка FireBird на FreeBSD из портов
Провели обновление портов на FreeBSD, в портах /usr/ports/databases/firebird25-server скачалась свежая версия Firebird 2.5.2_1
Установка FireBird из портов проведена с некоторыми нюансами
cd /usr/ports/databases/firebird25-server
make
#из под обычного пользователя user
make install
#из под пользователя root
и Firebird 2.5.2_1 поставился корректно, без ошибок.
Клиент /usr/ports/databases/firebird25-client тоже поставился корректно.
Запускаем FireBird сервер скриптом /usr/local/etc/rc.d/firebird который создался автоматически c опцией onestart.
Server# /usr/local/etc/rc.d/firebird onestart
Сервер запустился, работает. Подключения из скриптов к базе проходят, запросы выполняются. IBExpert тоже нормально подключился к базе, но вот тут и начались проблемы…
В чем заключалась проблема с кодировкой WIN1251 ?
При создания соединения с базой если указать кодировку соединения в IBExpert то при подключении выдается ошибка CHARACTER SET WIN1251 is not installed.
Если не указывать кодировку в настройках соединения с базой FireBird подключение к базе проходит нормально запросы выполняются, но с одним условием – если в запросе не использовать таблицы с данными на кириллице то все работает нормально, как только появляется кириллица то все кончает работать.
Как была решена проблема ранее в FireBird 2.5.1 ?
Аналогичная проблема была при установке FireBird 2.5.1 и там проблема с кодировками была решена созданием символической ссылки
#ln /usr/local/etc/firebird/fbintl.conf /usr/local/libexec/firebird/intl/fbintl
И Firebird 2.5.1 начал нормально работать с кириллицей на FreeBSD
Решение проблемы в FireBird 2.5.2_1
В данном случае, для версии 2.5.2_1 копирования файла fbintl.conf не дало результатов.
Создание символической ссылки
#ln /usr/local/etc/firebird/fbintl.conf /usr/local/libexec/firebird/intl/fbintl
Тоже безрезультатно.
Попытки редактирования файла fbintl.conf и указать в нем прямой путь к модулю /usr/local/libexec/firebird/intl/fbintl тоже результатов не дали.
Попытки переустановить Firebird 2.5.2_1 несколько раз (из по рута, не из под рута) из портов и не из портов результатов не дали - сервер запускался нормально но при указании кодировки WIN1251 подключение не устанавливается или SQL запросы не выполняются.
Все попытки указали на то, что проблема где-то в настройках и/или в конфигурации Firebird.
В качестве проверки правильности работы подключили функцию ADDHOUR из UDF библиотеки /usr/local/libexec/firebird/udf/fbudf.so которая идет в инсталляции Firebird.
UDF подключилась нормально, функция ADDHOUR сработала и выдала правильный результат.
Попытки использовать strace ничего не дали.
Попытки подключения к базе через утилиту isql-fb с параметром кодировки -cn WIN1251 дают точно такую же ошибку «CHARACTER SET WIN1251 is not installed» как и при подключении с через IBExpert.
Просмотр логов
Посмотрели логи FireBird в то время как работали и получали ошибку
#cat /var/db/firebird/firebird.log
free82 Thu Apr 4 15:16:51 2013
Can't load INTL module '/usr/local/etc/firebird/intl/fbintl.so'
free82 (Client) Thu Apr 4 16:39:24 2013
/usr/local/bin/fbguard: /usr/local/sbin/fb_smp_server terminated
free82 (Client) Thu Apr 4 16:39:24 2013
/usr/local/bin/fbguard: guardian starting /usr/local/sbin/fb_smp_server
Решение проблемы к кодировкой FireBird
Создаем папку /usr/local/etc/firebird/intl
# mkdir /usr/local/etc/firebird/intl
Далее создаем две ссылки
# ln /usr/local/etc/firebird/fbintl.conf /usr/local/etc/firebird/intl/fbintl.conf
# ln /usr/local/libexec/firebird/intl/fbintl /usr/local/etc/firebird/intl/fbintl
Перезапускаем сервер
# /usr/local/etc/rc.d/firebird onerestart
И проблема решена – кодировка WIN1251 в базе Firebird на FreeBSD заработала без ошибок.
Заключение
Логи надо читать сразу как только появилась ошибка.