字符串池验证

Windows Installer 将所有数据库字符串存储在单个共享字符串池中,以降低数据库大小并提高性能。 验证字符串池的唯一方式是使用 Windows Installer SDK 中的 MsiInfo 工具。

字符串池验证包括两项主要检查:

DBCS 字符串测试

DBCS 字符串测试扫描数据库中的每个字符串以查找两个条件:对于标记了非特定代码页的包,如果任一字符是扩展字符(大于 127),则标记该字符串,并显示一条消息,指出数据库的代码页无效,因为这些字符要求在所有系统上一致地呈现特定的代码页。

如果数据库有一个代码页,则扫描每个字符串以查找无效的 DBCS 指示器。 如果未正确标记特定字符串,字符将无法正确呈现。 (最常见的原因是使用数据库中已有特定字符串的 _ForceCodepage 表强制代码页为特定值。)请注意,此检查要求在系统上安装数据库的代码页。

如果存在代码页问题,用户可以使用 _ForceCodepage 表将数据库的代码页强制为适当的值来修复错误。 有关详细信息,请参阅代码页处理

引用计数验证

若要验证所有字符串的引用计数,请扫描每个表以查找字符串值,保留每个不同字符串的计数,并将结果与数据库字符串池中存储的引用计数进行比较。

如果存在字符串引用计数问题,用户应立即使用 MsiDatabaseExport 导出数据库的每个表,创建新数据库,并使用 MsiDatabaseImport 将表导入到新数据库中。 然后,新数据库的内容与旧数据库相同,但字符串引用计数正确。 在字符串池损坏的数据库中添加或删除数据可能会增加数据库损坏和数据丢失,因此快速执行这些步骤对于防止进一步的数据丢失非常重要。

重新生成数据库时,请记得在新数据库中嵌入任何必要的存储和流(参见 _Streams 表_Storages 表),并注意代码页问题。 此外,请记得设置每个必需的摘要信息流属性。