【问题标题】:Storing Unicode data to Database将 Unicode 数据存储到数据库
【发布时间】:2012-01-10 09:48:57
【问题描述】:

目前我们正在从 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 数据存储到数据库中。

【问题讨论】:

  • 您想对数据使用什么编码? UTF-8 通常是一个不错的选择。
  • 您使用的是 SQL 服务器吗?如果是这样,您可以使用解析为ftMemo 的XML 数据类型(它提供XQuery 支持)(我认为与nvarchar(MAX) 相同)。
  • 这个问题的答案取决于您使用的数据访问组件。阿多? SQL Server 版本? SQL Antive 客户端正在使用中?
  • @David Heffernan-> 现在我们使用 UTF-8,但在讨论将其更改为 UTF-16 @da-soft -> 我们使用 ADO 和 SQL Sever 2008

标签: database delphi unicode blob delphi-xe2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    并在将 XML 字符串保存为 blob 之前将其转换为 UTF8 编码。

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 2017-06-16
      • 2020-07-19
      • 2021-10-11
      • 2021-06-10
      • 2021-09-04
      相关资源
      最近更新 更多