Firebird
使用不同的字元集重新創建現有數據庫
我想將現有數據庫的字元集從無更改為 utf8,似乎最安全的方法是創建一個新的,然後將數據泵入其中。
我嘗試了兩種方法,都給了我同樣的錯誤:
- 創建一個帶有 utf8 字元集的新數據庫,然後創建一個簡單的儲存過程以通過“外部數據源上的執行塊”來抽取數據
- 在此命令行中使用 fbclone
fbclone -l fbembed.dll -v -s source.gdb -t destination.gdb -u SYSDBA -p masterkey -tc UTF8 -wc UTF8
兩者都給了我一個格式錯誤的字元串錯誤,並且大多數行都沒有復製到目標數據庫。
範例詳細錯誤
Incompatible column/host variable data type GDS Code: 335544569 - SQL Code: -303 - Error Code: 249 fields values --- VANUM = 244458 RUBNUM = 5054 VALEUR = Absence de germes pathogènes. ATBANA = DATEMODIF = 16/05/2018
在您目前的設置中,您似乎嘗試直接從 NONE 轉換為 UTF8,完成此操作後,將檢查儲存為 NONE 的字節是否為有效的 UTF8,然後按原樣儲存。格式錯誤的字元串錯誤意味著 NONE 列中的數據實際上不是 UTF8 中的有效字節組合。
在正確轉換數據之前,您需要找出數據的實際字元集是什麼(即使您沒有收到錯誤,也不一定意味著轉換在邏輯上是正確的)。如果目前儲存的數據不是不同的字元集(例如
WIN1252
在西歐和美國很常見),您可能想嘗試一下。當您手動抽水時,這意味著您要麼必須顯式轉換數據。那是從
NONE
toWIN1252
(或不管它是什麼),然後是 toUTF8
。例如,如果數據儲存在 中column1
,那麼您將使用cast(cast(column1 as varchar(<length>) character set WIN1252) as varchar(<length>) character set UTF8)
我沒有使用 fbclone 的經驗,但是您兩次指定 UTF8 的事實表明一個是源字元集,另一個是目標字元集。您可能想嘗試將其中一個或另一個更改為
WIN1252
(或另一個)以查看哪個有效。確保事後檢查數據。
在最壞的情況下,您可能擁有實際上混合了不同字元集的 NONE 數據,在這種情況下,您可能必須手動檢查和轉換每一行。