2

我正在尝试创建包含文件路径的记录。使用驱动程序将插入到Postgres启用了 UTF8 的数据库中。NpqSQL

我的表定义:

CREATE TABLE images
(
    id serial,
    file_location character varying NOT NULL
)

我的 SQL 语句,包括执行它的代码(归结为最低限度):

string sqlStatement = "INSERT INTO images (file_location) VALUES ('\\2010')";

NpgsqlConnection dbConnection = new NpgsqlConnection(connectionString);
dbConnection.Open();
NpgsqlCommand dbCommand = new NpgsqlCommand(sqlStatement , dbConnection);
int result = dbCommand.ExecuteNonQuery();
dbConnection.Close();    

使用pgAdmin插入上述语句时,它工作正常。通过Visual Studio C#使用NpgSQL驱动程序,失败并出现以下异常:

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

正如Milen准确解释的那样,Postgres 将该语句解释为一个octal数字 (\o201 == 0x81)。

正如Milen还描述E的,路径的前面没有帮助。

快速回顾一下:为什么 NpqSQL 会停止我插入\\2010?

4

2 回答 2

3

(意识到我的评论看起来像一个答案,所以相应地转换了它们。)

您还没有显示真实的代码,所以我想您的解释器/编译器将双反斜杠解释为转义的反斜杠,然后 Postgres 只看到一个反斜杠后跟一些数字。它解释为八进制字节值(八进制 201 = 十六进制 81)。

关于“转义”字符串常量(以“E”开头的字符串)-在您的情况下,它们完全没有必要。在标准 SQL 中,反斜杠没有特殊含义。

请阅读手册(http://www.postgresql.org/docs/current/static/sql-syntax-lexical. html#SQL-SYNTAX-CONSTANTS ) 了解详情。

于 2010-03-23T16:50:27.000 回答
1

Milen值得称赞,因为他引导我找到答案 - 谢谢!

显然,在将我的 SQL 语句插入 Postgres 之前,NpgSQL 执行了一次转义迭代。因此,为了解决我的问题,我用两个反斜杠替换了所有出现的反斜杠:

string path = ... my path ...
path = path.Replace("\\", "\\\\");
sqlStatement = "INSERT INTO images (file_location) VALUES ('" + path + "')";
于 2010-03-25T14:36:07.690 回答