我想将现有数据库的字符集从无更改为 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
到WIN1252
(或不管它是什么)然后到UTF8
。例如,如果数据存储在 中column1
,那么您将使用我没有使用 fbclone 的经验,但是您两次指定 UTF8 的事实表明一个是源字符集,另一个是目标字符集。您可能想尝试将一个或另一个更改为
WIN1252
(或另一个)以查看哪个有效。确保事后检查数据。
在最坏的情况下,您可能没有实际上是不同字符集混合的数据,在这种情况下,您可能必须手动检查和转换每一行。