为PostgreSQL数据库的C#中的UTF8编码筛选无效字节序列

为PostgreSQL数据库的C#中的UTF8编码筛选无效字节序列,c#,postgresql,utf-8,odbc,npgsql,C#,Postgresql,Utf 8,Odbc,Npgsql,我一直在寻找和尝试许多不同的解决方案来解决这个问题,但还没有找到答案。基本上,我使用复制查询将ODBC连接中的数据插入PostgreSql数据库,但复制查询停止并返回此错误 ERROR: invalid byte sequence for encoding "UTF8": 0x92 CONTEXT: COPY [TableName], line 1: "189572|1-00-1202|1-|00-|1202||AP||1... STATEMENT: COPY [TableName] FR

我一直在寻找和尝试许多不同的解决方案来解决这个问题,但还没有找到答案。基本上,我使用复制查询将ODBC连接中的数据插入PostgreSql数据库,但复制查询停止并返回此错误

ERROR:  invalid byte sequence for encoding "UTF8": 0x92
CONTEXT:  COPY [TableName], line 1: "189572|1-00-1202|1-|00-|1202||AP||1...
STATEMENT:  COPY [TableName] FROM STDIN (DELIMITER '|', NULL '')
ODBC连接驱动程序设置为ANSI,从中提取的Sybase/Advantage数据库编码为Unicode。要正确理解此错误消息,在360000个条目中,它只会在其中一个条目上跳起来。问题在于,即使有一个错误,复制查询也会停止并且不会完成

下面是我提取数据的C#代码

OdbcDataReader reader = test.ExecuteReader();
int rowCount = reader.FieldCount;

while (reader.Read())
{

    for (int i = 0; i < rowCount; i++)
    {
        dataEntry = dataEntry + reader[i].ToString() + "|";
    }

    dataEntry = dataEntry.Trim().Substring(0, dataEntry.Length - 1).Replace("\r",string.Empty).Replace("\n", string.Empty);

    UTF8Encoding utf8 = new UTF8Encoding();

    var raw = utf8.GetBytes(string.Concat(dataEntry,"\n"));

    copy.CopyStream.Write(raw, 0, raw.Length);
    dataEntry = "";
}
OdbcDataReader=test.ExecuteReader();
int rowCount=reader.FieldCount;
while(reader.Read())
{
对于(int i=0;i

基本上,我正在寻找一种方法来过滤掉C#中无效的UTF8字节序列,或者删除它们,或者用不同的字符替换它们,这样复制查询就不会报告错误。非常感谢您的帮助。谢谢。0x92是Unicode

PostgreSQL支持此字符:

regress=> SELECT E'\u0092', length(E'\u0092');
 ?column? | length 
----------+--------
 \u0092   |      1
(1 row)
所以你不应该犯错误。在PostgreSQL实例上运行上述语句并报告结果

然而,这很可能是一种症状。最有可能的是字符是转义序列的第二部分,并且您的代码没有进行正确的解码,因此第一部分作为一些不相关的字符而不是转义被使用,然后您在这里遇到了一个错误

这让我想知道:

ODBC连接驱动程序设置为ANSI,从中提取的Sybase/Advantage数据库编码为Unicode

。。。为什么不在Unicode模式下使用Sybase驱动程序

如果您在ANSI模式下使用它,您必须确保您(或C#驱动程序接口)正确地从发送的原始编码字符串解码Sybase发送的数据


我在这里看不到过滤坏数据的方法,因为你的C#应用程序就是产生utf-8的原因。它应该是有效的utf-8。如果您正在与一个因某种原因无法处理U+0092的Pg的旧版本/有缺陷的版本交谈,那么在转换为utf-8之前,您可以始终使用与其他替换相同的方式过滤该字符。

看一看:。我建议尝试不同的
throwOnInvalidBytes
encoderShouldMittutF8Identifier
值,谢谢您的回复。无论出于何种原因,Sybase ODBC驱动程序似乎没有UNICODE设置。我能够使用一些断点,并发现我发送的字符串有一个双反斜杠“\\”,这似乎是PostgreSQL不喜欢的(可能是因为它是一个转义序列)。所以我用四倍反斜杠替换了每一个双反斜杠,它没有出现任何错误。看起来您的初始
副本
语句-您没有显示-必须没有
with(format csv)
。但您试图提供类似csv的数据,而不是pg本机副本格式的数据。