如何为Unicode数据升级Firebird?

时间:2011-11-04 16:10:30

标签: unicode firebird

我正在使用Firebird 2.5.1和普通的Varchar ... 然后我想使用Unicode升级所有数据(访问Delphi XE2,DBExpress) 我搜索但没有很好的帮助.. 那么你能告诉我如何将我的数据升级到unicode firebird吗? 非常感谢...祝你有愉快的一天。

3 个答案:

答案 0 :(得分:1)

您可以查看IBExpert迁移或使用fbclone

等工具

答案 1 :(得分:0)

在Firebird中,您必须为每个varchar字段指定一个字符集。所以没有“正常”varchar。如果未在CREATE TABLE语句中明确指定它,Firebird将使用数据库的缺省字符集 Firebird中有一些可用的字符集。可能你的意思是ASCII或带有“正常”的ISO-Charset。除了这些chacsets,Firebirds还支持UNICODE_FSS或UTF8。 可以更改数据库中字段的字符集 首先,您必须找出您喜欢的字符集使用哪个ID。为此,您可以查看表格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-domains,并使用一个单语句进行更改。

答案 2 :(得分:0)

您可以使用以下方法:

  1. 扫描数据库中的每个表格以查找字符串字段
  2. 对于每个字符串字段,使用unicode字符集
  3. 创建另一个字符串字段
  4. 在字段之间复制数据
  5. 删除原始字段
  6. 重命名临时字段
  7. 以下是数据转换代码的示例:

    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. 删除并重新创建任何依赖于正在转换的字段的触发器或存储过程