繁体   English   中英

NpgSQL插入文件路径包含反斜杠“ \\\\”

[英]NpgSQL insert file path containing backslashes “\\”

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

我的表定义:

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

(意识到我的评论看起来像是答案,因此将其相应地转换了。)

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

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

请阅读手册中的“ 4.1.2.1。字符串常量”和“ 4.1.2.2。带C样式转义符的字符串常量”( http://www.postgresql.org/docs/current/static/sql-syntax-lexical。 html#SQL-SYNTAX-CONSTANTS )以获取详细信息。

麦恩(Milen)因将我引向答案而值得称赞-谢谢!

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

string path = ... my path ...
path = path.Replace("\\", "\\\\");
sqlStatement = "INSERT INTO images (file_location) VALUES ('" + path + "')";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM