UTF8,IBX和Firebird与欧元符号

时间:2018-04-08 21:57:53

标签: delphi utf-8 firebird delphi-10.2-tokyo euro

我通过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组件连接到数据库。

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

  • UTF8字符串域
  • 包含UTF8字段的表

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

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

  

目标多字节代码页中不存在Unicode字符的映射

1 个答案:

答案 0 :(得分:3)

我决定写这篇文章,以便分享我在差不多一个星期和不眠之夜后找到的解决方案。

问题是由创建数据库代码生成的。 由于参数不同,并且与通常的连接参数不同,我将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;

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