Решение проблемы с кодировкой FireBird на FreeBSD. Решено.


Решение проблемы с кодировкой FireBird на FreeBSD. Решено.

После обновления 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 заработала без ошибок.

 

Заключение

Логи надо читать сразу как только появилась ошибка.