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 用户管理选项。
我在向本地主机上运行的 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 functionsisc_add_user()
,isc_delete_user()
, andisc_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 用户管理选项。