Firebird连接charset

时间:2015-01-07 13:24:20

标签: character-encoding firebird firebird2.5

我在向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?

1 个答案:

答案 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用户管理选项。