2011-11-04 14 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. 下降和重新創建任何觸發器或存儲過程,它依賴於現場被轉換