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
组件连接到数据库。
在这种情况下,我正在创建:
- UTF8 字符串域
- Table 使用 UTF8 字段
并在其中设置欧元符号 (€
)。
应用打开,字段可见。
当我重新启动应用程序时,我不断收到错误消息:
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;
并完成所有操作。这样就可以正常工作了。
我正在 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 字符串域
- Table 使用 UTF8 字段
并在其中设置欧元符号 (€
)。
应用打开,字段可见。 当我重新启动应用程序时,我不断收到错误消息:
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;
并完成所有操作。这样就可以正常工作了。