我正在尝试创建一个包含文件路径的记录。插入是使用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
?
答案 0 :(得分:3)
(意识到我的评论看起来像一个答案,所以相应地转换了它们。)
你没有显示真正的代码,所以我认为你的解释器/编译器将双反斜杠解释为转义反斜杠,然后Postgres只看到一个反斜杠后跟一些数字。它解释为八进制字节值(八进制201 =十六进制81)。
关于“escape”字符串常量(以“E”开头的字符串) - 在您的情况下,它们是完全没必要的。在标准SQL中,反斜杠没有特殊含义。
请参阅手册(http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS)中的“4.1.2.1。字符串常量”和“4.1.2.2。带有C风格转义的字符串常量”。
答案 1 :(得分:1)
Milen 值得我的回答 - 谢谢!
在将我的SQL语句插入Postgres之前,NpgSQL执行一次转义迭代。因此,为了解决我的问题,我用两个反斜杠替换了我的反斜杠的所有出现:
string path = ... my path ...
path = path.Replace("\\", "\\\\");
sqlStatement = "INSERT INTO images (file_location) VALUES ('" + path + "')";