Firebird

使用不同的字元集重新創建現有數據庫

  • February 12, 2020

我想將現有數據庫的字元集從無更改為 utf8,似乎最安全的方法是創建一個新的,然後將數據泵入其中。

我嘗試了兩種方法,都給了我同樣的錯誤:

  1. 創建一個帶有 utf8 字元集的新數據庫,然後創建一個簡單的儲存過程以通過“外部數據源上的執行塊”來抽取數據
  2. 在此命令行中使用 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在西歐和美國很常見),您可能想嘗試一下。

當您手動抽水時,這意味著您要麼必須顯式轉換數據。那是從NONEto WIN1252(或不管它是什麼),然後是 to UTF8。例如,如果數據儲存在 中column1,那麼您將使用

cast(cast(column1 as varchar(<length>) character set WIN1252) as varchar(<length>) character set UTF8)

我沒有使用 fbclone 的經驗,但是您兩次指定 UTF8 的事實表明一個是源字元集,另一個是目標字元集。您可能想嘗試將其中一個或另一個更改為WIN1252(或另一個)以查看哪個有效。

確保事後檢查數據。

在最壞的情況下,您可能擁有實際上混合了不同字元集的 NONE 數據,在這種情況下,您可能必須手動檢查和轉換每一行。

引用自:https://dba.stackexchange.com/questions/213019