【问题标题】:How to read data with charset NONE from Firebird database?如何从 Firebird 数据库中读取字符集 NONE 的数据?
【发布时间】:2021-03-10 07:53:05
【问题描述】:

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

【问题讨论】:

  • Now, the correct form is to read DB in correct charset form NONE 这根本不是真的。在这种情况下,尽管仍然很脆弱,但正确的方法是指定与数据库中文本数据的二进制格式完全相同的连接字符集。
  • 是 firebird 3 还是 firebird 2 ? // 在 FB2 的情况下,可以使用 SQL 命令或 IBExpert 之类的 IDE 侵入“系统表”并追溯为列分配适当的字符集。然后,您最好将表复制到自身上,以使新的“格式版本”分布在所有行中,例如update tablename set text_blob_column = '' || text_blob_column。但是对备用数据库副本进行实验,您可以随时将其扔到回收站并从新的标准具副本开始,如有任何疑问。

标签: c# .net firebird firebird-.net-provider


【解决方案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 作为连接字符集,这种情况下最好指定 UTF8 作为连接字符集。

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

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 2022-10-18
    • 2020-01-12
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多