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

Escape single quote character for use in an SQLite query

提问人:jpm 提问时间:3/3/2009 最后编辑:Super Kai - Kazuya Itojpm 更新时间:10/23/2023 访问量:188764

问:

我编写了数据库架构(到目前为止只有一个表),并在一个文件中编写了该表的 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

我的文件的第 16 行如下所示:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');

问题在于单引号的转义字符。我还尝试过对单引号进行双转义(使用代替),但这也没有用。我做错了什么?\\\'\'

SQL 数据库 SQLite 转义 单引号

评论


答:

372赞 Ryan Guill 3/3/2009 #1

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

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

文档中的相关引用:

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

评论

10赞 Donal Fellows 5/20/2013
此外,如果主机语言支持绑定参数,请考虑使用绑定参数(大多数支持,但 SQLite shell 不支持)。然后,SQL将直接提供值(无需替换)。INSERT INTO table_name (field1, field2) VALUES (?, ?)
1赞 JacksOnF1re 6/8/2018
我们不能只使用双引号吗?like: INSERT INTO table_name (field1, field2) VALUES (123, “Hello there's”); ?
0赞 Gary Z 7/11/2018
此外,根据字符串的生存期,第一步可能是将 '' 转换为 ',然后再将它们加倍。
2赞 Steven Fisher 4/8/2021
@JacksOnF1re 在 SQL 中,双引号用于标识符而不是字符串。就像 这是兼容性的一个怪癖,双引号的工作方式与文字一样。参见:sqlite.org/...INSERT INTO "table_name"("field1", "field2") VALUES('value 1', 'value 2');
0赞 Rene Lorenz 10/29/2023
如前所述@DonalFellows:考虑准备好的陈述。在这里看到一个很好的例子 stackoverflow.com/questions/61794729/...
52赞 overslacked 3/3/2009 #2

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

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
3赞 sapbucket 12/6/2017 #3

在 C# 中,可以使用以下命令将单引号替换为双引号:

 string sample = "St. Mary's";
 string escapedSample = sample.Replace("'", "''");

输出将是:

"St. Mary''s"

而且,如果您直接使用 Sqlite;你可以使用对象而不是字符串,并捕获像DBNull这样的特殊东西:

private static string MySqlEscape(Object usString)
{
    if (usString is DBNull)
    {
        return "";
    }
    string sample = Convert.ToString(usString);
    return sample.Replace("'", "''");
}
10赞 Charlie D. Eupeña 12/11/2017 #4

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

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

 String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";

这在 C# 和 Java 中对我有用

评论

0赞 Kenneth Evans 7/30/2020
注意:C# 中的 replace(“'”,“''”)。(唯一的变化是大写的 R。
18赞 M.Fahri 1/4/2018 #5

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

.replace(/\'/g,"''")

例:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
-1赞 Dan Tanner 7/1/2020 #6

在 bash 脚本中,我发现对于可能为 null 或包含需要转义的字符(如连字符)的值,在值周围转义双引号是必要的。

在此示例中,columnA 的值可以为 null 或包含连字符。

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";

评论

1赞 Steven Fisher 4/8/2021
sqlite 中的双引号表示“这是一个标识符,而不是字符串”。因此,虽然它对一些黑客攻击很好,但你不会希望在生产中使用它。
1赞 Pepik 12/20/2021 #7

演示不需要复杂性或双引号的单引号字符串行为。

测试:

SELECT replace('SAMY''S','''''',''''); 

输出:

SAMY'S

SQLite版本:

SELECT sqlite_version();

输出:

3.36.0
1赞 Super Kai - Kazuya Ito 10/2/2023 #8

根据文档:

  • ""被包围的 被计算为 所以被计算到 和 被计算到 (偶数) 但 和 (奇数)不起作用。* 可用于将标识符(如表名和列名、、等)括起来,也可用于将标识符括起来。"""""""""""""""""""""""""""""SELECTWHERE[]``

  • ''被包围的 被计算为 所以被计算到 和 被计算到 (偶数) 但 和 (奇数)不起作用。* 可用于将字符串文字(如值)括起来。'''''''''''''''''''''''''''''

*不要用于包围字符串文字,因为根据我的实验存在错误。""

*不要使用标识符,因为根据我的实验,有时无法正常工作。''

例如,您可以创建如下图所示:my"tablemy"column

CREATE TABLE "my""table" (
  "my""column" TEXT
);

艺术

CREATE TABLE [my"table] (
  [my"column] TEXT
);

艺术

CREATE TABLE `my"table` (
  `my"column` TEXT
);

然后,您可以插入一行 for to,如下所示:my"valuemy"columnmy"table

INSERT INTO "my""table" ("my""column") VALUES ('my"value');

艺术

INSERT INTO [my"table] ([my"column]) VALUES ('my"value');

艺术

INSERT INTO `my"table` (`my"column`) VALUES ('my"value');

最后,您可以获得如下所示的行:

SELECT * FROM "my""table";

艺术

SELECT * FROM [my"table];

艺术

SELECT * FROM `my"table`;

并且,您可以使用如下所示的方式进行创建:my'tablemy'column

CREATE TABLE "my'table" (
  "my'column" TEXT
);

艺术

CREATE TABLE [my'table] (
  [my'column] TEXT
);

艺术

CREATE TABLE `my'table` (
  `my'column` TEXT
);

然后,您可以插入一行 for to,如下所示:my'valuemy'columnmy'table

INSERT INTO "my'table" ("my'column") VALUES ('my''value');

艺术

INSERT INTO [my'table] ([my'column]) VALUES ('my''value');

艺术

INSERT INTO `my'table` (`my'column`) VALUES ('my''value');

最后,您可以获得如下所示的行:

SELECT * FROM "my'table";

艺术

SELECT * FROM [my'table];

艺术

SELECT * FROM `my'table`;