1

Firebird 表有 2 个 blob 字段 - blob_binary 字段(子类型=0)和 blob_Text 字段(子类型=1,utf-8)。DB 有 utf 编码。连接具有 utf 编码。Delphi 的版本是 10.2.3。我使用 FireDac 组件进行数据访问。服务器是火鸟 3。

在此处输入图像描述

应用程序必须将数据从文本文件(utf-8)写入“内容”表的两个 blob 字段。文本文件,我必须写在 blob 中,包含英语、俄语和格鲁吉亚语的文本(见图)。

项目和数据库文件,具有编辑权限

下面的代码在二进制 blob字段中写入文本,但字符很奇怪(不是 ??? simbols。也许是 Ansi 字符?)。

在 Blob_Binary字段中保存文本文件的代码:

ID:=Query1.FieldByName('Content_id').asInteger;
OpenDialog1.Execute;
Query1.Close;
Query1.SQL.Text := 'SELECT * FROM content where Content_id=:id';
Query1.Params[0].AsInteger:=ID;
Query1.open;

Query1.Edit;
(Query1.FieldByName('BLOB_BINARY') as TBlobField).LoadFromFile(OpenDialog1.FileName);
Query1.Post;

当我将文本文件保存在二进制 blob字段中时:

1)如果我以编码 utf-BOM 保存文本文件,我会得到二进制 blob 普通文本和

2) 如果我选择文本文件编码为 utf,则会出现奇怪的字符。

但是当我使用相同的代码在文本 blob字段中写入数据时,数据看起来像汉字一样奇怪(见图)。

在此处输入图像描述

我错了什么?如何更正此代码以在两个字段中写入 utf 字符?

我尝试了另一种解决方案,但结果是一样的。例如:

ID:=Query1.FieldByName('Content_id').asInteger;
OpenDialog1.Execute;
Query1.Close;
Query1.SQL.Text := 'Update content set Blob_Text=:Blob_Text where 
Content_id=:id';
Query1.Params[0].DataType := ftBlob;
Query1.Params[0].AsStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead);
Query1.Params[1].AsInteger:=ID;
Query1.ExecSQL;

Update1:​​正如我所意识到的,如果我将 txt 文件保存为 noteped 中的“unicode”(或 noteped++ 中的 ucs-2 LE BOM),它将在文本 blob 中保存得很好,中文字符消失了。同样,二进制 blob 中的 txt 文件如果采用 utf-BOM 编码,则可以很好地保存。虽然无法将文件保存在utf-8中非常不舒服。

在此处输入图像描述

4

2 回答 2

1

您所看到的内容称为mojibake,它是由以与最初编写的编码不同的编码解释文本引起的。当您获得随机 CJK(中文/日文/韩文)字符时,它通常来自错误地解释 8 位(ASCII、ANSI、UTF-8 等)将文本编码为 UTF-16。查看您的字符串类型以及进出数据库的字符串类型,并检查有关 ANSI 和 Unicode 字符串类型不匹配的编译器警告,您应该能够相当快地了解这一点。

于 2019-02-12T23:14:57.143 回答
0

我对 ADOQuery 和 Firebird 2.5 Blob Field Sub_Type 1 (Text) 有同样的错误,字符串字段转换得很好,blob 不是。

如果我更改与 IBX 的连接,一切正常

解决者:

SettingsTEXT.AsString := UTF8Decode(SettingsTEXT.AsString)

AdoDBBug

于 2021-10-13T10:26:41.437 回答