转义用于sqlite查询的单引号字符

lfapxunr  于 2021-09-08  发布在  Java
关注(0)|答案(6)|浏览(604)

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

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

hc8w905p

hc8w905p1#

尝试将单引号加倍(许多数据库都这样认为),因此:

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

文件中的相关引用:
字符串常量是通过将字符串括在单引号(')中形成的。字符串中的一个单引号可以通过将两个单引号放在一行中进行编码,就像在pascal中一样。不支持使用反斜杠字符的c样式转义,因为它们不是标准sql。blob文字是包含十六进制数据的字符串文字,前面有一个“x”或“x”字符。。。文字值也可以是标记“null”。

bzzcjhmw

bzzcjhmw2#

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

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

hrysbysz3#

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

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

例子:

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

qncylg1j4#

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

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

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

这在c#和java中适用

pbpqsu0x

pbpqsu0x5#

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

wdebmtf26#

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

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

相关问题