将Unicode数据存储到数据库

时间:2012-01-10 09:48:57

标签: database delphi unicode blob delphi-xe2

目前,我们正在从Delphi 2007迁移到Delphi XE2以支持Unicode。我们将大型XML数据作为blob存储在数据库中。要将blob值插入数据库字段,我们使用下面的代码

Param.DataType := ftBlob;
Param.AsBlob := Value;

但是现在为了支持unicode,我们将数据库中的所有blob字段传递给nvarchar(max)。我们将上面的代码更改为

Param.DataType := ftwideString;
Param.AsString := Value;

这是正确的做法,还是应该以不同的方式处理,以便将Unicode数据存储到数据库中。

2 个答案:

答案 0 :(得分:3)

BLOB会存储你扔给他们的任何内容,而不会推断出任何相关信息。虽然它们可能几乎没有操作功能,但它们永远不会修改数据。另一方面,基于字符的字段(甚至是CLOB)将具有关联的字符集。因此,存储在那里的数据将从源字符集和目标字符集来回转换。例如,如果您的XML文件是UTF-8编码且字段是UTF-16,则在写入和读取时将对其进行转换。当然,如果两种编码都相同,则不进行转换。如果您的数据库缺少XML类型,我会将它们存储在二进制lobs中,如果它们可以使用不同的编码并且不需要对它们进行操作(但是需要写入/读取)。如果它们总是处于相同的编码中,则字符lob可以更容易使用。使用带有大型XML文件的字符字段可能会因最大字段大小而导致错误。

答案 1 :(得分:1)

虽然您的解决方案应该可行,但我建议保留blob字段格式,使用UTF8作为数据库的默认编码(firebird示例):

CREATE DATABASE 'localhost:c:\Data\MyDatabase.FDB' user 'SYSDBA' password 'masterkey'
  DEFAULT CHARACTER SET UTF8;

并将XML字符串转换为UTF8编码,然后再将其保存为blob。