转义单引号字符以在SQLite查询中使用

jpm*_*jpm 163 sqlite escaping

我编写了数据库模式(到目前为止只有一个表),并在一个文件中编写了该表的INSERT语句.然后我创建了数据库,如下所示:

$ sqlite3 newdatabase.db
SQLite version 3.4.0
Enter ".help" for instructions
sqlite> .read ./schema.sql
SQL error near line 16: near "s": syntax error
Run Code Online (Sandbox Code Playgroud)

我的文件的第16行看起来像这样:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');
Run Code Online (Sandbox Code Playgroud)

问题是单引号的转义字符.我也试过双重转义单引号(使用\\\'而不是\'),但这也不起作用.我究竟做错了什么?

Rya*_*ill 275

尝试将单引号加倍(许多数据库都希望这样),所以它会是:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
Run Code Online (Sandbox Code Playgroud)

文件中的相关引用:

通过将字符串括在单引号(')中形成字符串常量.字符串中的单引号可以通过在行中放入两个单引号来编码 - 如Pascal中所示.不支持使用反斜杠字符的C样式转义,因为它们不是标准SQL.BLOB文字是包含十六进制数据的字符串文字,前面是单个"x"或"X"字符....文字值也可以是令牌"NULL".

  • 另外,如果宿主语言支持它们,请考虑使用绑定参数(大多数都支持,但SQLite shell不支持).那么SQL将是`INSERT INTO table_name(field1,field2)VALUES(?,?)`并且值将直接提供(并且没有替换). (8认同)
  • @JacksOnF1re 在 SQL 中,双引号用于标识符而不是字符串。就像 `INSERT INTO "table_name"("field1", "field2") VALUES('value 1', 'value 2');` 双引号完全像文字一样工作,这是兼容性的一个怪癖。请参阅:https://www.sqlite.org/quirks.html#double_quoted_string_literals_are_accepted (3认同)

ove*_*ked 42

我相信你想通过加倍单引号来逃避:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
Run Code Online (Sandbox Code Playgroud)


小智 8

要替换字符串中的所有('),请使用

.replace(/\'/g,"''")
Run Code Online (Sandbox Code Playgroud)

例:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
Run Code Online (Sandbox Code Playgroud)


小智 7

以防万一,如果您有需要插入数据库的循环或 json 字符串。尝试用单引号替换字符串。这是我的解决方案。例如,如果您有一个包含单引号的字符串。

String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");

 String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";
Run Code Online (Sandbox Code Playgroud)

这在 c# 和 java 中对我有用