使用 Delphi XE-8 和 FIREBIRD 本地数据库时出现“SELECT * FROM ....”异常

Posted

技术标签:

【中文标题】使用 Delphi XE-8 和 FIREBIRD 本地数据库时出现“SELECT * FROM ....”异常【英文标题】:Exception when 'SELECT * FROM ....' with Delphi XE-8 and FIREBIRD local database 【发布时间】:2016-03-20 11:54:54 【问题描述】:

它引发一个异常:每次 Delphi XE-8 程序执行这段代码:

procedure TForm_hora_edit_.SpdBtn_KOMISII_ZASEDANIA_Click(Sender: TObject);
begin
  Data_Module.IBQuery_KOMISII_ZASEDANIA_.Active := False;
  Data_Module.IBQuery_KOMISII_ZASEDANIA_.SQL.Text := 'SELECT * FROM KOMISII_ZASEDANIA ORDER BY ZASED_DT DESC';
  Data_Module.IBQuery_KOMISII_ZASEDANIA_.Active := True;  
end;

在这一行引发了异常:

Data_Module.IBQuery_KOMISII_ZASEDANIA_.Active := True;

异常信息:

目标多字节中没有 Unicode 字符的映射 代码页

我确实使用免费软件创建了表 KOMISII_ZASEDANIA:用于 IB/FB 的 SQL Manager Lite

数据库的字符集是:UTF8;该表包含来自西里尔字母的字符。

我需要避免上述异常。

【问题讨论】:

显示你用来连接的 TDataSet 组件的属性。很可能你忘了设置连接字符集 在ibase.ru/devinfo/ibx.htm 找到“lc_type”,并在 sql.ru 上查看论坛 我使用的组件是:TIBQuery,它不包含任何属性连接字符集,(和charset没有什么相似之处)。 尝试通过ru.wikipedia.org/wiki/IBExpert检查您的数据库//在该IDE中注册数据库后-尝试三个实验:关闭数据库,在注册属性中将Connection Charset设置为1:NONE; 2:WIN1251; 3:UTF-8 ,打开数据库,尝试查询是否会显示数据或失败。另外我建议你检查数据库和表是 UTF-8,而不是 UNICODE_FSS TIBQuery 不会浮在空中 - 你将它连接到一些数据库组件,该组件应该具有正确的连接参数,包括连接字符集 【参考方案1】:

显示的错误不是 Firebird 的错误,它可能是 Delphi 在接收到字段的字节并以 UTF-8 解释它们时的错误。根据 cmets 和问题描述,看起来该字段可能是CHARACTER SET NONE,而当前内容可能是WIN1251(或其他单字节编码),而不是UTF-8;具有字符集NONE 意味着 Firebird 无法将其转换为目标连接编码并按原样发送,留给客户端应用程序进行解释。

确保该字段具有NONEOCTETS 以外的字符集,并根据需要转换当前内容。

【讨论】:

...或者 IBX 最终失去了与后来的 Firebird 的兼容性

以上是关于使用 Delphi XE-8 和 FIREBIRD 本地数据库时出现“SELECT * FROM ....”异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 Delphi 应用程序的 Firebird 错误“未定义用户名和密码”

如何在firemonkey Delphi XE 8上的Facebook等Android通知栏中使用外部大图像?

Delphi:如何以编程方式创建 Firebird 数据库

如何在 Firebird 3.0 上启用线压缩

是否可以为少数用户使用 Firebird Embedded

使用 Delphi 数据感知组件 - 优点和缺点 [关闭]