UTF8、IBX 和带有欧元符号的 Firebird

UTF8, IBX and Firebird with Euro symbol

我正在 Delphi 10.2 Tokyo 中通过 IBX 组件连接到 Firebird。

我正在尝试通过以下代码连接到数据库:

IBDatabase.Connected := False;
IBDatabase.Params.Clear;
IBDatabase.DatabaseName := FDBFileName;
IBDatabase.Params.Values['user_name'] := FDBUserName;
IBDatabase.Params.Values['password'] := FDBPassword;
IBDatabase.Params.Values['lc_ctype'] := 'UTF8';
IBDatabase.Connected := True;

通过在连接期间捕获异常,我可以意识到如果数据库不存在,然后我使用以下代码创建它:

IBDatabase.Params.Clear;
IBDatabase.DatabaseName := FDBFileName;
IBDatabase.Params.Add('USER ''SYSDBA''');
IBDatabase.Params.Add('PASSWORD ''masterkey''');
IBDatabase.Params.Add('PAGE_SIZE 16384');
IBDatabase.Params.Add('DEFAULT CHARACTER SET UTF8');
IBDatabase.CreateDatabase;

以上操作创建了数据库并使 TIBDatabase 组件连接到数据库。

在这种情况下,我正在创建:

并在其中设置欧元符号 ()。

应用打开,字段可见。 当我重新启动应用程序时,我不断收到错误消息:

No mapping for the Unicode character exists in the target multi-byte code page

我决定写这个 post 是为了分享我在将近一个星期和不眠之夜后找到的解决方案。

问题是由创建数据库代码产生的。 由于参数与通常的连接参数不同,我将 DEFAULT CHARACTER SET UTF8 设置为 UTF8,相信我将要在数据库中操作的任何 DDL 或语句都具有 UTF8 字符集。

这不是真的,数据库连接的行为与设置了 lc_ctype 参数的行为不同。

为了解决这个问题,我只需要关闭与数据库的连接,像第一次那样重置参数:

IBDatabase.Connected:= False;
IBDatabase.Params.Clear;
IBDatabase.DatabaseName:= FDBFileName;
IBDatabase.Params.Values['user_name']:= FDBUserName;
IBDatabase.Params.Values['password']:= FDBPassword;
IBDatabase.Params.Values['lc_ctype']:= 'UTF8';
IBDatabase.Connected:= True;

并完成所有操作。这样就可以正常工作了。