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

时间:2017-05-10 17:21:52

标签: c# postgresql encoding npgsql

我正在计算数据阅读器中的所有行,因为我正在这样做:

  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;。在一定数量的记录之后,我收到以下消息的异常:

  

错误:22021:编码的无效字节序列\" UTF8 \":0xbb

我正在使用postgres 9.4,而Npgsql版本(从nuget下载)是3.2.2。我的数据库编码是SQL_ASCII,有没有办法让我在不改变数据库编码的情况下成功读取完整的数据读取器?

2 个答案:

答案 0 :(得分:2)

默认情况下,Npgsql会将客户端编码设置为UTF8,这意味着PostgreSQL负责提供有效的UTF8数据,在数据库不是UTF8的情况下执行服务器端转换。但是,SQL_ASCII是特殊的,因为它意味着"我们对127"以外的字符一无所知。 (见the PG docs)。所以PostgreSQL不对它们进行转换。

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

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

答案 1 :(得分:0)

AFAIK无法从SQL_ASCII启用postgres的内置转换。可能你应该使用像iconv ou recode这样的工具手动完成。

  

如果客户端字符集被定义为SQL_ASCII,则编码   无论服务器的字符集如何,都禁用转换。只是   至于服务器,除非你正在工作,否则使用SQL_ASCII是不明智的   使用全ASCII数据。

来自PostgreSQL documentation