如何从 Firebird 数据库中使用字符集 NONE 读取数据?

问题描述

有一些旧的数据库是基于 NONE 编码的,具有独特的拉丁字符,如 á 并且读作 ? .现在,正确的形式是以正确的字符集形式读取数据库 NONE 并且它在连接字符串中指定,但是如果指定 charset = NONE,库 Firebirdsql.Data.FirebirdClient 也不会读取这些值。我该如何解决这种情况?现在的结果就像“编辑”,但需要带撇号。我正在使用 .NET Core 和 Firebirdsql.Data.FirebirdClient 版本 7.10.1,我尝试降级并且是一样的。

解决方法

如果您知道存储在这些列中的数据的实际字符集是什么,您可以将数据转换为正确的字符集。

例如,如果字符应为 windows-1252 (WIN1252):

select cast(yourcolumn as varchar(100) character set win1252) from yourtable
-- replace varchar(100) with the actual size

要获得更持久的解决方案,请使用正确的字符集创建一个新数据库,然后抽取数据,应用正确的转换。

请注意,将 NONE 指定为连接字符集几乎从来都不是正确的解决方案,即使从使用 NONE 作为列字符集的数据库读取数据时,也有可能当您使用 NONE已经使用 NONE 作为连接字符集,在这种情况下,最好指定 UTF8 作为连接字符集。

通常,将数据的预期字符集指定为连接字符集也将允许您读取数据,但详细信息因驱动程序而异,而且我不确定 Firebird ADO.net 提供程序的行为。