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

hwazgwia  于 2023-10-23  发布在  SQLite
关注(0)|答案(8)|浏览(178)

我在一个文件中编写了数据库模式(到目前为止只有一个表)和该表的SQL语句。然后我创建了数据库如下:

$ 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');

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

4zcjmb1e

4zcjmb1e1#

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

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

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

vwhgwdsa

vwhgwdsa2#

我相信你会想通过双引号来逃避:

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

mec1mxoz3#

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

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

举例说明:

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

gcxthw6b4#

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

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

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

这对我来说在C#和Java中很有效。

nwo49xxi

nwo49xxi5#

在C#中,你可以用下面的代码将单引号替换为双引号:

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

输出将是:

"St. Mary''s"

如果你是直接使用SQLite的话;你可以使用对象而不是字符串,并捕获像DBLOG这样的特殊东西:

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

rqqzpn5f6#

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

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

输出量:

SAMY'S

SQLite版本:

SELECT sqlite_version();

输出量:

3.36.0
y1aodyip

y1aodyip7#

根据the doc

  • ""包围的""被计算为",所以"""""""""""""""(偶数),但"""""""""(奇数)不起作用。* ""可用于包围表和列名等标识符,SELECTWHERE等,[]和````也可用于包围标识符。
  • ''包围的''被计算为',所以'''''''''''''''(偶数),但'''''''''(奇数)不起作用。* ''可用于包围字符串文字,如值。
  • 不要使用""来包围字符串,因为根据我的实验会有错误。
  • 不要使用''来包围标识符,因为根据我的实验,有时不能正常工作。

例如,您可以使用my"column创建my"table,如下所示:

CREATE TABLE "my""table" (
  "my""column" TEXT
);

或者:

CREATE TABLE [my"table] (
  [my"column] TEXT
);

或者:

CREATE TABLE `my"table` (
  `my"column` TEXT
);

然后,您可以插入一行my"value,用于my"columnmy"table,如下所示:

INSERT INTO "my""table" ("my""column") VALUES ('my"value');

或者:

INSERT INTO [my"table] ([my"column]) VALUES ('my"value');

或者:

INSERT INTO `my"table` (`my"column`) VALUES ('my"value');

最后,你可以得到如下所示的行:

SELECT * FROM "my""table";

或者:

SELECT * FROM [my"table];

或者:

SELECT * FROM `my"table`;

并且,您可以使用my'column创建my'table,如下所示:

CREATE TABLE "my'table" (
  "my'column" TEXT
);

或者:

CREATE TABLE [my'table] (
  [my'column] TEXT
);

或者:

CREATE TABLE `my'table` (
  `my'column` TEXT
);

然后,您可以插入一行my'value,用于my'columnmy'table,如下所示:

INSERT INTO "my'table" ("my'column") VALUES ('my''value');

或者:

INSERT INTO [my'table] ([my'column]) VALUES ('my''value');

或者:

INSERT INTO `my'table` (`my'column`) VALUES ('my''value');

最后,你可以得到如下所示的行:

SELECT * FROM "my'table";

或者:

SELECT * FROM [my'table];

或者:

SELECT * FROM `my'table`;
fbcarpbf

fbcarpbf8#

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

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

相关问题