4

目前,我们的数据库使用 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 论坛主题:InterBase 中的 Unicode 数据库 - 真的吗?(这不是我的主题,但它表明 InterBase XE 中仍然存在一些问题)。

以下是我提交的一些报告: QC#92867 - 仅当视图包含联合并且使用 ClientDataSet 时,来自视图的字符串字段为空白。在我的一些报告中发现这是缺少数据,这些报告不再有效。

QC#91494 - IB 字符列数据字符字段(例如:Char(1))在通过存储过程检索时用空白填充。测试失败 - 例如:如果 Active = "Y"。我大量使用带有表单的存储过程,但这些都不起作用。

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

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

其他相关QC条目:

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

4

8 回答 8

1

Database Workbench和IBExpert都可以为您完成数据迁移。

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

——杰伦

于 2010-02-21T18:31:10.163 回答
1

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

症状:消息“未找到或未由其他用户编辑的记录”

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

于 2010-05-18T12:57:28.213 回答
0

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

症状:脚本导入到 InterBase 时出错

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

于 2010-05-19T13:50:30.450 回答
0

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

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

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

于 2010-05-18T12:54:40.997 回答
0

问题:持久字符串字段需要一个 Size 属性,该属性是该字段的逻辑大小乘以四(另请参阅:是否可以调整 TStringField 使其像 Delphi 中的 TWideStringField 一样工作?

症状:访问冲突

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

于 2010-05-18T12:59:46.973 回答
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 参数。

于 2010-05-19T13:22:51.633 回答
0

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

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

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

于 2010-05-19T13:42:35.317 回答
0

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

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

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

于 2010-05-19T13:45:56.857 回答