我在一个文件中编写了数据库架构(到目前为止只写了一张表)以及该表的 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');
问题是单引号的转义字符。我还尝试了双重转义单引号(使用
\\\'
而不是 \'
),但这也不起作用。我做错了什么?
尝试将单引号加倍(许多数据库都希望如此),所以它会是:
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
来自文档的相关引用:
字符串常量是通过将字符串括在单引号(')中形成的。字符串中的单引号可以通过将两个单引号放在一行中进行编码 - 就像 Pascal 中一样。不支持使用反斜杠字符的 C 样式转义,因为它们不是标准 SQL。 BLOB 文字是包含十六进制数据且前面带有单个“x”或“X”字符的字符串文字。 ...文字值也可以是标记“NULL”。
我相信你想通过加倍单引号来逃避:
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
要替换字符串中的所有 ('),请使用
.replace(/\'/g,"''")
示例:
sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
以防万一您有需要插入数据库的循环或 json 字符串。尝试用单引号替换字符串。这是我的解决方案。例如,如果您有一个包含单引号的字符串。
String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");
String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";
这在 C# 和 Java 中对我有用
在 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("'", "''");
}
演示不需要复杂性或双引号的单引号字符串行为。
测试:
SELECT replace('SAMY''S','''''','''');
输出:
SAMY'S
SQLite 版本:
SELECT sqlite_version();
输出:
3.36.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 或包含需要转义的字符(如连字符)的值,需要转义值周围的双引号。
SELECT * FROM 'my''table';