перевод
misc\upgrade\metadata\metadata_charset.txt
выполнен kdv, iBase.ru, 21.04.2008.
Копирование текста запрещается.
Версии Firebird до версии 2.1 имели две проблемы с наборами символов и извлечением метаданных:
пример: при появлении кодировки KOI8R стало возможным, к примеру, хранить данные в 1251, и автоматически конвертировать их при чтении и записи на клиенте в KOI8R, например из клиента под Linux. Это нормально работало со строковыми столбцами, кроме текстов процедур и триггеров и блобов. Блобы, хранимые в Win1251 передавались клиенту без перекодировки в koi8r, и т.д.
Даже в версии 2.1, проблема 1 может возникнуть если вы создаете или изменяете объекты с клиентской кодировкой NONE или UNICODE_FSS, но с текстом не в кодировке UNICODE_FSS.
Если вы создаете или создавали метаданные с не ASCII символами (любые национальные символы, например 1251 и т.д.), то вам нужно "отремонтировать" вашу базу данных чтобы метаданные корректно читались после обновления на 2.1.
Чтобы проделать эту операцию, база данных должна быть в формате ODS11.1 (backup, и затем restore в FB 2.1). Перед этим сделайте копию базы данных.
Также рекомендуется делать реконнект перед выполнением каждого действия, приведенного ниже.
Создайте процедуры перекодировки метаданных в базе данных
---------------------------------------
- 1. isql database.fdb
- 2. SQL> input 'misc/upgrade/metadata/metadata_charset_create.sql';
Проверьте базу данных
----------------------
- 1. isql database.fdb
- 2. SQL> select * from rdb$check_metadata;
Процедура rdb$check_metadata вернет список объектов, которые будут обработаны.
Если ошибок не происходит, то ваши метаданные в порядке, и можно переходить к разделу "Удаление процедур обновления метаданных".
Иначе, первый "плохой" объект является последним в списке перед возникновением ошибки.
Для исправления метаданных, вам нужно знать, в каком наборе символов были созданы эти метаданные. Скрипт обновления метаданных будет работать корректно только если все метаданные были созданы в одном и том же наборе символов.
Исправление метаданных
-------------------
- 1. isql database.fdb
- 2. SQL> input 'misc/upgrade/metadata/metadata_charset_create.sql';
- 3. SQL> select * from rdb$fix_metadata('WIN1252'); -- replace WIN1252 by your charset
- 4. SQL> commit;
Процедура rdb$fix_metadata возвращает те же данные, что и rdb$check_metadata, но с исправлением текста метаданных.
Запускать эту процедуру можно только один раз!
После этого можно удалить процедуры обновления метаданных.
Удаление процедур обновления метаданных
-------------------------------
- 1. isql database.fdb
- 2. SQL> input 'misc/upgrade/metadata/metadata_charset_drop.sql';