[英]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.