Как я могу обновить Firebird для данных Unicode? - PullRequest
0 голосов
/ 04 ноября 2011

Я использую Firebird 2.5.1 с обычным Varchar ... Затем я хотел бы обновить все данные с помощью Unicode (для доступа к Delphi XE2, DBExpress) Я искал, но не хорошая помощь .. Можете ли вы посоветовать мне, как обновить мои данные до Unicode Firebird? Большое спасибо ... и хорошего дня.

Ответы [ 3 ]

1 голос
/ 04 ноября 2011

Вы можете взглянуть на IBExpert миграции или использовать такие инструменты, как fbclone

0 голосов
/ 06 ноября 2011

Вы можете использовать следующий подход:

  1. Сканирование каждой таблицы в базе данных на наличие строковых полей
  2. Для каждого строкового поля создайте дополнительное поле, используя набор символов Unicode
  3. Копировать данные между полями
  4. Оставить исходное поле
  5. Переименовать временное поле

Ниже приведен пример кода для преобразования данных:

EXECUTE BLOCK
AS
  DECLARE VARIABLE fn CHAR(31) CHARACTER SET UNICODE_FSS;
  DECLARE VARIABLE rn CHAR(31) CHARACTER SET UNICODE_FSS;
  DECLARE VARIABLE cl INTEGER;
BEGIN
  FOR
    SELECT 
      r.rdb$field_name, 
      r.rdb$relation_name, 
      f.rdb$character_length
    FROM 
      rdb$relation_fields r JOIN rdb$fields f
        ON f.rdb$field_name = r.rdb$field_source
    WHERE 
      f.rdb$character_set_id >= 10 
        AND f.rdb$character_length > 0
        AND f.rdb$field_sub_type IS NULL
    INTO :fn, :rn, :cl
  DO BEGIN
    EXECUTE STATEMENT 'ALTER TABLE "' || :rn ||
      '" ADD unique_temp_field_name VARCHAR(' || :cl ||
      ') CHARACTER SET UNICODE_FSS'
    WITH AUTONOMOUS TRANSACTION;

    EXECUTE STATEMENT 'UPDATE "' || :rn ||
      '" SET unique_temp_field_name = "' || :fn || '"'
    WITH AUTONOMOUS TRANSACTION;

    EXECUTE STATEMENT 'ALTER TABLE "' || :rn || '" DROP "' || :fn || '"'
    WITH AUTONOMOUS TRANSACTION;

    EXECUTE STATEMENT 'ALTER TABLE "' || :rn || 
      '" ALTER unique_temp_field_name TO ' ||
      '"' || :fn || '"'
    WITH AUTONOMOUS TRANSACTION;
  END
END

Для реального применения этот код должен быть изменен так:

  1. Передать ограничения полей и значения по умолчанию
  2. Удалите, а затем восстановите PK, FK, индексы, которые используют конвертируемое поле
  3. Удаление и повторное создание любого триггера или хранимой процедуры, которая зависит от преобразуемого поля.
0 голосов
/ 04 ноября 2011

В Firebird вы должны указать набор символов для каждого поля varchar. Так что нет "нормального" varchar. Если вы не укажете это явно в вашей инструкции CREATE TABLE, Firebird использует набор символов по умолчанию вашей базы данных.
В Firebird есть несколько доступных наборов символов. Возможно, вы имели в виду ASCII или ISO-Charset с «нормальным». Помимо этих chacsets Firebirds поддерживает UNICODE_FSS или UTF8. Можно изменить набор символов полей в вашей БД.
Сначала вы должны узнать, какой идентификатор использует ваш предпочтительный набор символов. Для этого вы можете посмотреть в таблице RDB $ CHARACTER_SETS
После этого вам необходимо выяснить, какой домен используется столбцом, который вы хотите изменить. Если вы не укажете пользовательский домен в своем операторе CREATE TABLE, Firebird создаст его для каждого столбца.
Чем вы можете изменить используемый набор символов для этого домена в системной таблице.

update RDB$FIELDS T1
  set T1.RDB$CHARACTER_SET_ID = 4
  where RDB$FIELD_NAME = (select RDB$FIELD_SOURCE 
                            from RDB$RELATION_FIELDS T2 
                            where T2.RDB$RELATION_NAME = 'NEW_TABLE' 
                              and T2.RDB$FIELD_NAME = 'NEW_FIELD')

В качестве альтернативы вы можете найти все varchar-домены в системных таблицах и изменить их одним оператором.

...