我通过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
组件连接到数据库。
在这种情况下,我正在创建:
并在其中设置欧元符号(€
)。
应用程序打开,字段可见。 当我重新启动应用程序时,我不断收到错误:
目标多字节代码页中不存在Unicode字符的映射
答案 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;
并完成所有操作。这样就可以正常工作。