Firebird 连接字符集

Firebird connection charset

我在向本地主机上运行的 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?

isc_add_user 函数没有连接字符集,很可能它只接受 ASCII。

另请注意,函数 isc_add_user 自 InterBase 6(Firebird 在 1999/2000 中分叉的版本)以来已被弃用。

Deprecated use of InterBase 5 user functions
The API functions isc_add_user(), isc_delete_user(), and isc_modify_user() are made obsolete by the introduction of the InterBase Services API. The new Services API functions are preferred over the version 5 user configuration functions in order to provide a consistent services mechanism, interface, and set of messages.

(来自 InterBase 6 API 指南,第 219 页)

建议改用服务管理器,或者 - Firebird 2.5 或更高版本 - SQL user management。由于我不能 100% 确定您可以控制服务管理器的连接字符集,因此我建议您改用 SQL 用户管理选项。