读取 NpgsqlDataReader 时编码的字节序列无效

Invalid byte sequence for encoding when reading NpgsqlDataReader

我正在计算数据 reader 中的所有行数,为此我正在这样做:

  connection = new NpgsqlConnection(CS);
  connection.Open();

  command = new NpgsqlCommand(cmd, connection);

  dataReader = command.ExecuteReader();

  while (dataReader.Read())
  {
      res++;
  }

其中 CS 是我的连接字符串,格式为 Server=server_here;Port=port_here;User Id=username_here;Password=password_here;Database=database_here;。一定数量的记录后,我收到以下消息的异常:

ERROR: 22021: invalid byte sequence for encoding \"UTF8\": 0xbb

我使用的是postgres 9.4,Npgsql版本(从nuget下载)是3.2.2。我的数据库编码是SQL_ASCII,有什么方法可以让我在不改变数据库编码的情况下成功读取完整数据reader?

AFAIK 无法从 SQL_ASCII 启用 postgres 的内置转换。也许你应该手动完成,使用像 iconv ou recode.

这样的工具

If the client character set is defined as SQL_ASCII, encoding conversion is disabled, regardless of the server's character set. Just as for the server, use of SQL_ASCII is unwise unless you are working with all-ASCII data.

引自PostgreSQL documentation.

默认情况下,Npgsql 会将客户端编码设置为 UTF8,这意味着 PostgreSQL 有责任提供有效的 UTF8 数据,在数据库不是 UTF8 的情况下执行服务器端转换。然而,SQL_ASCII 是特殊的,因为它表示 "we don't know anything about characters beyond 127"(参见 the PG docs)。所以 PostgreSQL 不对这些执行任何转换。

如果您知道您的数据库采用某种特定的非 UTF8 编码(例如,ISO 8859-1),您可以在连接字符串上传递 Client Encoding 参数,并使用有效的 .NET 名称编码。这将使 Npgsql 正确解释超过 127 个来自 PostgreSQL 的字符。如果你真的不知道你的数据库使用什么编码,那么,你也无能为力...

有关详细信息,请参阅 this issue