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

时间:2009-03-02 19:12:37

标签: 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

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

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

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

6 个答案:

答案 0 :(得分:255)

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

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

the documentation的相关引用:

  

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

答案 1 :(得分:42)

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

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

答案 2 :(得分:7)

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

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

示例:

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

答案 3 :(得分:2)

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

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

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

这适用于c#和java

答案 4 :(得分:0)

在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("'", "''");
}

答案 5 :(得分:0)

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

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

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