【问题标题】:Delphi dbExpress and Interbase: UTF8 migration steps and risks?Delphi dbExpress 和 Interbase:UTF8 迁移步骤和风险?
【发布时间】:2010-02-20 15:35:36
【问题描述】:

目前,我们的数据库使用 Win1252 作为唯一的字符编码。我们很快将不得不在数据库表中支持 Unicode,这意味着我们必须为四个数据库和大约 80 个在内部 24/7 环境中运行的 Delphi 应用程序执行此迁移。是否有建议将数据库迁移到 Delphi 应用程序的 UTF-8(或 UNICODE_FSS)?下面列出了一些问题。非常感谢您的回答!

  • 是否有工具通过转储数据、使用 UNICODE_FSS 或 UTF-8 重新创建数据库来帮助迁移现有数据库(大小在 250 MB 和 2 GB 之间,无 Blob 字段) ,然后加载数据?
  • Delphi 2009、dbExpress 和 Interbase 7.5 是否存在与 Unicode 字符集相关的已知问题
  • 您是否建议先将数据库升级到 Interbase 2009? (此升级已计划,但优先级不高)
  • 我们可以简单地迁移数据库,Delphi 会自动处理 Unicode 字符集,还是我们也必须更改每个 Datamodule(dfm 和源代码)中的所有 字符字段类型
  • 您会推荐哪种策略与现有应用程序的正常开发和维护并行进行迁移?该应用程序在内部运行,因此开发和数据库管理在内部完成。

更新:来自 InterBase 论坛主题:Unicode Databases in InterBase - Really?(这不是我的主题,但它表明 InterBase XE 中仍然存在一些问题)。

以下是我提交的一些报告: QC#92867 - 字符串字段为空 仅当视图来自视图 包括一个联合,并且当使用一个 客户端数据集。这被发现为 我的一些报告缺少数据, 不再起作用。

QC#91494 - IB字符列数据 字符字段(例如:Char(1))是 检索时用空格填充 通过一个存储过程。测试失败 - 例如:如果活动 = “Y”。我大量使用带有表单的存储过程 这些都不起作用。

QC#91355 - IBSqlMonitor 失败。这 IBSqlMonitor 的输出有点 乱码使该工具无用。 (所以, 连我的铲子都坏了!)

未报告 - 中的持久字段 TWideString 的 TClientDataSet 失败。

其他相关QC条目:

QC#94455SQL Unicode 字符类型失败(InterBase XE)

【问题讨论】:

    标签: delphi utf-8 delphi-2009 interbase dbexpress


    【解决方案1】:

    Database WorkbenchIBExpert 都可以为您完成数据迁移。

    当我在 Entwickler Tage 时,我会就其他问题回复你。

    --杰罗恩

    【讨论】:

      【解决方案2】:

      问题:空字符串字段上的 UPDATE 不再找到记录。如果 UTF8 字符字段为空,DataSetProvider 会为更新操作生成错误的 SELECT。

      症状:消息'记录未找到或未被其他用户编辑'

      解决方案:升级到 Delphi 2010 Update 4 或使用 QC 中描述的解决方法

      【讨论】:

        【解决方案3】:

        问题:CHAR 字段不再起作用,必须用 VARCHAR 替换。

        症状:对现在使用 UTF8 并从 WIN1252 导入的具有 ASCII 值的列的 SELECT 查询不再返回任何值。也许这是我应该在 QC 中报告的错误。

        解决方案:将数据库元数据DDL脚本中所有出现的CHAR(替换为VARCHAR(

        【讨论】:

          【解决方案4】:

          问题:持久字符串字段需要一个 Size 属性,该属性是字段的逻辑大小乘以四(另请参阅:Is it possible to tweak TStringField to work like TWideStringField in Delphi?

          症状:访问冲突

          解决方案:删除持久字段并重新添加以更新 Size 属性。 (副作用:DisplayWidth 也会增加尺寸,导致 UI 出现问题)

          【讨论】:

            【解决方案5】:

            问题:带有字符串参数的 UDF(用户定义函数)可能会因为大小限制而中断。

            症状:

            Dynamic SQL Error.
            SQL error code = -204.
            Data type unknown.
            Implementation limit exceeded.
            COLUMN DSQL internal.
            

            对于这个 UDF:

            DECLARE EXTERNAL FUNCTION STRLEN
                CSTRING(32767)
                RETURNS INTEGER BY VALUE
                ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';
            

            解决方案:修复声明中的 UDF 参数。

            【讨论】:

              【解决方案6】:

              问题:dbExpress 在内部使用 WideString 作为数据类型,因此所有现有的 .AsString 读取/设置字段和参数的调用将不再起作用

              症状:特殊字符将无法正确存储/读取

              解决方案:将所有出现的 .AsString 替换为 .AsWideString,但注意不要更改未在字段或参数上调用 AsString 方法的位置。

              【讨论】:

                【解决方案7】:

                问题:dbExpress 需要 WIN1252 字段的 TStringField 对象。对于 UTF8 数据库字段,dbExpress 需要 TWideStringField 对象。

                症状:错误消息“预期:发现 WideString:字符串”

                解决方案:将所有出现的 TStringField 替换为 TWideStringField。这要求所有表单文件 (dfm) 都是文本,而不是二进制文件。修改后的表单和数据模块将不会向后兼容。

                【讨论】:

                  【解决方案8】:

                  问题:导出 WIN1252 数据库的元数据和表数据会创建一个 CP1252 编码文件,但导入时需要 UTF8 文件(已通过 IBExpert 测试)

                  症状:脚本导入 InterBase 时出错

                  解决方案:使用iconv将脚本文件转为UTF8

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-06-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-13
                    • 1970-01-01
                    相关资源
                    最近更新 更多