208

我在一个文件中编写了数据库模式(到目前为止只有一个表)和该表的 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');

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

4

7 回答 7

335

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

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

文档中的相关引用:

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

于 2009-03-02T19:14:43.257 回答
47

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

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
于 2009-03-02T19:15:57.590 回答
14

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

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

例子:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
于 2018-01-04T01:26:33.210 回答
7

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

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

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

这在 c# 和 java 中对我有用

于 2017-12-11T07:51:24.067 回答
2

在 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("'", "''");
}
于 2017-12-05T22:04:05.540 回答
0

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

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

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
于 2020-06-30T20:00:26.490 回答
0

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

测试:

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

输出:

SAMY'S

SQLite 版本:

SELECT sqlite_version();

输出:

3.36.0
于 2021-12-19T19:43:27.353 回答