代码之家  ›  专栏  ›  技术社区  ›  Chau

npgsql插入包含反斜杠\的文件路径

  •  2
  • Chau  · 技术社区  · 14 年前

    我正在尝试创建一个包含文件路径的记录。将插入到 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();    
    

    使用时 高级管理人员 若要插入上述语句,它可以正常工作。使用 新产品质量管理体系 驾驶员通过 Visual Studio C# ,失败,但出现以下异常:

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

    AS 米伦 准确地解释,Postgres将语句解释为 octal 数字(\o201==0x81)。

    AS 米伦 还描述了 E 在这条路的前面不起作用。

    所以简单回顾一下:为什么npqsql停止插入 \\2010 ?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Milen A. Radev    14 年前

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

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

    关于“escape”字符串常量(以“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 )有关详细信息。

        2
  •  1
  •   Chau    14 年前

    米伦 值得称赞的是,我得到了答案-谢谢!

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

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