2011-11-04 34 views
0

我用火鸟2.5.1与正常的Varchar ... 的话,我想升级使用Unicode的所有数据(访问德尔福XE2,dbExpress的) 我搜查,但没有很好的帮助.. 所以你能不能建议我如何将我的数据升级到unicode firebird? 非常感谢...祝您有个美好的一天。如何为Unicode数据升级Firebird?

回答

0

在Firebird中,您必须为每个varchar字段指定一个字符集。所以没有“正常”的varchar。如果您没有在CREATE TABLE语句中明确指定它,Firebird将使用数据库的默认字符集。
Firebird中有几个可用的字符集。可能你的意思是ASCII或ISO-Charset与“正常”。除了这些问题之外,Firebird支持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') 

Alternativly你可以看看在系统表中的所有VARCHAR域和一个单语句改变它。

+1

如果你改变了使用的字符此域在系统表中设置:你没有在良好的字符集编码的数据! ! ! –

+0

我试着用包含德文特殊字符的字符集WIN1252的列进行测试。将其更改为UNICODE_FSS后,仍然按预期工作。所以没有必要重新编码数据。 – Michael

+0

非常感谢你.. –

0

您可以使用以下方法:

  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. 下降和重新创建任何触发器或存储过程,它依赖于现场被转换