在c#中为PostgreSQL数据库过滤UTF8编码的无效字节序列

本文关键字:无效 字节 编码 UTF8 中为 PostgreSQL 数据库 过滤 | 更新日期: 2023-09-27 18:10:25

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

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。为了正确地看待这个错误消息,在360,000个条目中,它只在其中一个上出错。问题是COPY查询停止并且即使有一个错误也没有完成。

下面是我提取数据的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 = "";
}

基本上,我正在寻找一种方法来过滤掉c#中无效的UTF8字节序列,要么删除它们,要么用不同的字符替换它们,这样COPY查询就不会报告错误。非常感谢任何帮助。谢谢你。

在c#中为PostgreSQL数据库过滤UTF8编码的无效字节序列

0x92是Unicode U+0092的私有使用

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。如果您使用的是旧的或有bug的Pg版本,由于某种原因无法处理U+0092,那么在转换为utf-8之前,您可以始终以与执行其他替换相同的方式过滤掉该字符。