如何升级Firebird的Unicode数据?

如何升级Firebird的Unicode数据?,unicode,firebird,Unicode,Firebird,我正在使用Firebird 2.5.1和普通Varchar。。。 然后我想使用Unicode升级所有数据(访问Delphi XE2、DBExpress) 我找了些帮助,但没有找到。。 那么你能建议我如何将我的数据升级到unicode firebird吗? 谢谢。。。祝您度过愉快的一天。在Firebird中,您必须为每个varchar字段指定一个字符集。所以没有“正常”的varchar。如果未在CREATE TABLE语句中明确指定,Firebird将使用数据库的默认字符集。 Firebird中有

我正在使用Firebird 2.5.1和普通Varchar。。。 然后我想使用Unicode升级所有数据(访问Delphi XE2、DBExpress) 我找了些帮助,但没有找到。。 那么你能建议我如何将我的数据升级到unicode firebird吗?
谢谢。。。祝您度过愉快的一天。

在Firebird中,您必须为每个varchar字段指定一个字符集。所以没有“正常”的varchar。如果未在CREATE TABLE语句中明确指定,Firebird将使用数据库的默认字符集。
Firebird中有几个可用的角色集。可能您指的是ASCII或带“normal”的ISO字符集。除了这些CHACSET之外,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域,并用一条语句对其进行更改。

您可以查看迁移情况,或者使用类似的工具。

您可以使用以下方法:

  • 扫描数据库中的每个表以查找字符串字段
  • 对于每个字符串字段,使用unicode字符集创建一个附加字段
  • 在字段之间复制数据
  • 删除原始字段
  • 重命名临时字段
  • 下面是用于数据转换的代码示例:

    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
    
    对于实际应用程序,应修改此代码,以便:

  • 传输字段约束和默认值
  • 删除并恢复使用正在转换的字段的PK、FK和索引
  • 删除并重新创建依赖于正在转换的字段的任何触发器或存储过程

  • 如果您在系统表中更改此域使用的字符集:您不会在良好的字符集中编码数据!我用字符集为WIN1252(包括德语特殊字符)的列进行了尝试。在将其更改为UNICODE_FSS后,它仍能按预期工作。因此,在一些场景中,不需要重新编码数据。