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

Delphi UTF8、IBX和带欧元符号的Firebird,delphi,utf-8,firebird,delphi-10.2-tokyo,euro,Delphi,Utf 8,Firebird,Delphi 10.2 Tokyo,Euro,我通过Delphi10.2中的IBX组件连接到Firebird 我正试图通过以下代码连接到数据库: IBDatabase.Connected := False; IBDatabase.Params.Clear; IBDatabase.DatabaseName := FDBFileName; IBDatabase.Params.Values['user_name'] := FDBUserName; IBDatabase.Params.Values['password'] := FDBPasswor

我通过Delphi10.2中的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;
通过在连接过程中捕获异常,我可以意识到如果数据库不存在,那么我将使用以下代码创建它:

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字符的映射


我决定写这篇文章是为了分享我在几乎一个星期和不眠之夜后发现的解决方案

问题是由创建数据库代码产生的。 由于参数不同于通常的连接参数,我将默认字符集设置为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;
做所有的手术。这样它就能正常工作