转义单引号字符以用于SQLite查询


179

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

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

Answers:


293

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

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

文档中的相关报价:

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


8
另外,如果宿主语言支持绑定参数,请考虑使用绑定参数(大多数支持,但SQLite Shell不支持)。然后将是SQL,INSERT INTO table_name (field1, field2) VALUES (?, ?)并且将直接提供值(并且不进行替换)。
Donal Fellows

1
我们不能只使用双引号吗?像这样:INSERT INTO table_name(field1,field2)VALUES(123,“你好,有”);?
JacksOnF1re

另外,根据字符串的生命周期,第一步可能是先将''转换为”,然后再将其加倍。
加里Z

44

我相信您希望通过将单引号加倍来逃脱:

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

10

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

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

例:

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

6

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

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

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

这适用于我在C#和Java


0

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

0

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

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

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.