我在向localhost上运行的Firebird数据库服务添加新用户时遇到问题。调用客户端库fbclient.dll方法 isc_add_user 失败,错误代码为335544754(isc_error_adding_sec_record)和335544849(isc_malformed_string)。问题显然与变音符号有关。这是源代码的相关部分:
bool FirebirdService::AddUser(User &user)
{
ISC_STATUS status[20] = { 0 };
USER_SEC_DATA data = { 0 };
AnsiString server = (ip == L"localhost") || ip.IsEmpty() ? AnsiString("localhost") : AnsiString(ip);
AnsiString dba_user_name = app_config.AdminUser;
AnsiString dba_password = app_config.AdminPassword;
AnsiString name = user.GetLogin();
AnsiString password = user.GetPassword();
AnsiString first_name = user.GetFirstName();
AnsiString last_name = user.GetLastName();
data.sec_flags = sec_dba_user_name_spec | sec_dba_password_spec | sec_first_name_spec | sec_last_name_spec;
data.server = server.c_str();
data.protocol = (ip == L"localhost") || ip.IsEmpty() ? sec_protocol_local : sec_protocol_tcpip;
data.dba_user_name = dba_user_name.c_str();
data.dba_password = dba_password.c_str();
data.user_name = name.c_str();
data.first_name = first_name.c_str();
data.last_name = last_name.c_str();
data.password = password.c_str();
if (isc_add_user(status, &data))
{
return false;
}
return true;
}
这是结构字段data.first_name:
的字节内容[0]'J'74(0x4A)
[1]'á'-31(0xE1)
[2]'n'110(0x6E)
[3]'\ 0'0(0x00)
只要我将第二个字符'á'更改为'a',对 isc_add_user 的调用就会成功。我该如何妥善处理这种情况?有没有办法将连接字符集更改为utf-8或utf-16?
答案 0 :(得分:1)
isc_add_user
函数没有连接字符集,很可能它只接受ASCII。
另请注意,自InterBase 6(Firebird在1999/2000分叉的版本)以来,函数isc_add_user
已被弃用。
不推荐使用InterBase 5用户功能
API函数isc_add_user()
,isc_delete_user()
和isc_modify_user()
已生成 通过引入InterBase Services API而过时。新的Services API 函数优于版本5用户配置函数以提供 一致的服务机制,接口和消息集。
(来自InterBase 6 API指南,第219页)
建议使用服务管理器,或者 - Firebird 2.5或更高版本 - SQL user management。由于我不是100%确定您可以控制服务管理器的连接字符集,我建议您改用SQL用户管理选项。