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

问题描述 投票:0回答:8

我在一个文件中编写了数据库架构(到目前为止只写了一张表)以及该表的 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');

问题是单引号的转义字符。我还尝试了双重转义单引号(使用

\\\'
而不是
\'
),但这也不起作用。我做错了什么?

sqlite escaping
8个回答
369
投票

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

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

来自文档的相关引用:

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


52
投票

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

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

18
投票

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

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

示例:

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

10
投票

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

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

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

这在 C# 和 Java 中对我有用


3
投票

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

1
投票

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

测试:

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

输出:

SAMY'S

SQLite 版本:

SELECT sqlite_version();

输出:

3.36.0

0
投票
  • ""

    包围的

    ""
    被评估为
    "
    ,因此
    """"
    ""
    """"""
    """
    (偶数),但是
    "
    """
    """""
    (奇数数字)不起作用。 *
    ""
    可用于包围表名和列名等标识符。

  • ''

    包围的

    ''
    被评估为
    '
    ,因此
    ''''
    ''
    ''''''
    '''
    (偶数),但是
    '
    '''
    '''''
    (奇数数字)不起作用。 *
    ''
    可用于包围表名、列名等标识符以及值等字符串文字。

您可以使用

my"table
创建
my"column
,如下所示:

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

或者:

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

然后,您可以将

my"value
的行添加到
my"column
,如下所示:
my"table

或者:

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

创建

my'table
,如下所示:
my'column

或者:

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

然后,您可以将 
CREATE TABLE "my'table" ( "my'column" TEXT );

的行添加到

my'value
,如下所示:
my'column
或者:

my'table

然后,您可以得到如下所示的行:

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

或者:

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

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

-1
投票

SELECT * FROM 'my''table';

© www.soinside.com 2019 - 2024. All rights reserved.