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

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


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

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

相关文件引用:

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


我相信你会想通过双引号来转义:

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

在c#中,你可以使用下面的方法将单引号替换为双引号:

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

输出将是:

"St. Mary''s"

而且,如果你直接使用Sqlite;你可以使用object而不是string,并捕获特殊的东西,如DBNull:

private static string MySqlEscape(Object usString)
{
    if (usString is DBNull)
    {
        return "";
    }
    string sample = Convert.ToString(usString);
    return sample.Replace("'", "''");
}

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

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

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

这适用于我的c#和Java


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

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

例子:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")

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

在本例中,columnna的值可以为空或包含连字符。

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

在不需要复杂或双引号的情况下,演示单引号字符串行为。

测试:

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

输出:

SAMY'S

SQLite版本:

SELECT sqlite_version();

输出:

3.36.0