Данная статья - есть вольный перевод статьи misc/upgrade/metadata/metadata_charset.txt с собственными комментариями и дополнениями
В версиях Firebird до версии 2.1 были две проблемы связанные с наборами символов и извлечением метаданных:
- При создании/изменении объектов, никогда не транслитерировался (перекодировался) текст метаданных (текст процедур/триггеров, описания (rdb$description), ограничений (constraints)/значений по-умолчанию, и т.д.), из клиентского набора символов в системный (UNICODE_FSS). То есть, исходный текст просто помещался в столбец с кодировкой UNICODE_FSS.
- При чтении текстовых BLOB`в, они не перекодировались из набора символов BLOB`а в клиентский набор символов
Если вы создаете или создавали метаданные с не ASCII символами (любые национальные символы, например WIN1251 и т.д.), то вам нужно "отремонтировать" вашу базу данных чтобы метаданные корректно читались после обновления на 2.1.
Чтобы проделать эту операцию, база данных должна быть в формате ODS11.1 (backup, и затем restore в FB 2.1). Перед этим сделайте копию базы данных.
Также рекомендуется делать реконнект перед выполнением каждого действия, приведенного ниже.
Создаем процедуры перекодировки метаданных в базе данных:
$isql-fb database.fdb SQL> input '/usr/lib/Firebird/2.1/misc/upgrade/metadata/metadata_charset_create.sql'; SQL> quit;
Проверьте базу данных:
$isql-fb database.fdb SQL> select * from rdb$check_metadata; SQL> quit;
Процедура rdb$check_metadata вернет список объектов, которые будут обработаны.
Если ошибок не происходит, то ваши метаданные в порядке, и можно переходить к разделу "Удаление процедур обновления метаданных".
Иначе, первый "плохой" объект является последним в списке перед возникновением ошибки.
Для исправления метаданных, вам нужно знать, в каком наборе символов были созданы эти метаданные. Скрипт обновления метаданных будет работать корректно только если все метаданные были созданы в одном и том же наборе символов.
Исправление метаданных:
$isql-fb database.fdb SQL> input '/usr/lib/Firebird/2.1/misc/upgrade/metadata/metadata_charset_create.sql'; SQL> select * from rdb$fix_metadata('WIN1252'); -- replace WIN1252 by your DB charset SQL> commit; SQL> quit;
Процедура rdb$fix_metadata возвращает те же данные, что и rdb$check_metadata, но с исправлением текста метаданных.
Запускать эту процедуру можно только один раз!
Если это действие не помогло и при проверке базы данных возникают ошибки - необходимо проверить все метаданные (процедуры, триггеры и т.д.) на наличие в коде "плохих" символов (например, русскоязычные комментарии) и удалить их вручную.
После этого можно удалить процедуры обновления метаданных.
Удаление процедур обновления метаданных:
$isql-fb database.fdb SQL> input '/usr/lib/Firebird/2.1/misc/upgrade/metadata/metadata_charset_drop.sql'; SQL> quit;
Жопиздан:)