Delphi dbExpress 和 Interbase:UTF8 迁移步骤和风险?

4

目前,我们的数据库仅使用Win1252作为字符编码。我们很快就要支持数据库表中的Unicode,这意味着我们必须对四个数据库和约80个在内部运行的Delphi应用程序(24/7环境)进行迁移。是否有关于Delphi应用程序迁移到UTF-8(或UNICODE_FSS)的数据库迁移建议?以下是一些问题。非常感谢您提前的答复!

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

更新:从InterBase讨论论坛主题中获取:在InterBase中使用Unicode数据库-真的吗?(这不是我发布的主题,但它表明InterBase XE仍存在一些问题)。

这里是一些我提交的报告: QC#92867-字符串字段为空, 仅来自视图,如果视图包括Union,并且当使用 ClientDataSet时。这是在我的几个报告中缺失的数据, 它们不再工作了。

QC#91494-IB字符列数据, 当通过存储过程检索字符字段(例如:Char(1))时, 用空格填充。测试失败-例如:如果Active =“Y”。我经常利用带有表单的存储过程, 这些存储过程无法正常工作。

QC#91355-IBSqlMonitor 失败。 IBSqlMonitor的输出有点混乱,使得这个工具无法使用。(所以, 即使我的铲子也坏了!)

未报告-Persistent fields在 TClientDataSet中对于TWideString失败。

其他相关QC条目:

QC#94455 SQL Unicode字符类型故障(InterBase XE)

8个回答

1

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

当我参加 Entwickler Tage 时,我会回答您的其他问题。

--jeroen


1
问题: 在空字符串字段上执行UPDATE操作将不再查找记录。如果UTF8字符字段为空,则DataSetProvider为更新操作生成了错误的SELECT语句。

症状:提示“未找到记录或已被其他用户编辑”

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


0
问题: 由于大小限制,具有字符串参数的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参数。

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

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

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


0

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

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

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


0
问题: dbExpress需要TStringField对象来处理WIN1252字段。对于UTF8数据库字段,dbExpress需要TWideStringField对象。
症状:错误信息“expected: WideString found: string” 解决方案: 将所有TStringField替换为TWideStringField。这要求所有表单文件(dfm)都是文本,而不是二进制文件。修改后的表单和数据模块将不向后兼容。

0
问题: 导出WIN1252数据库的元数据和表数据将创建一个CP1252编码的文件,但导入需要一个UTF8文件(使用IBExpert测试)。
症状:脚本导入到InterBase时出现错误。 解决方案: 使用iconv将脚本文件转换为UTF8。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接