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中非常不舒服。