提问人:jpm 提问时间:3/3/2009 最后编辑:Super Kai - Kazuya Itojpm 更新时间:10/23/2023 访问量:188764
转义单引号字符以在 SQLite 查询中使用
Escape single quote character for use in an SQLite query
问:
我编写了数据库架构(到目前为止只有一个表),并在一个文件中编写了该表的 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 (?, ?)
INSERT INTO "table_name"("field1", "field2") VALUES('value 1', 'value 2');
我相信你会想通过加倍单引号来逃避:
INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');
在 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("'", "''");
}
以防万一,如果你有一个循环或一个json字符串需要插入到数据库中。尝试将字符串替换为单引号。这是我的解决方案。例如,如果字符串包含单引号。
String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");
String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";
这在 C# 和 Java 中对我有用
评论
对于替换字符串中的所有 ('),请使用
.replace(/\'/g,"''")
例:
sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")
在 bash 脚本中,我发现对于可能为 null 或包含需要转义的字符(如连字符)的值,在值周围转义双引号是必要的。
在此示例中,columnA 的值可以为 null 或包含连字符。
sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
评论
演示不需要复杂性或双引号的单引号字符串行为。
测试:
SELECT replace('SAMY''S','''''','''');
输出:
SAMY'S
SQLite版本:
SELECT sqlite_version();
输出:
3.36.0
根据文档:
""
被包围的 被计算为 所以被计算到 和 被计算到 (偶数) 但 和 (奇数)不起作用。* 可用于将标识符(如表名和列名、、等)括起来,也可用于将标识符括起来。""
"
""""
""
""""""
"""
"
"""
"""""
""
SELECT
WHERE
[]
``
''
被包围的 被计算为 所以被计算到 和 被计算到 (偶数) 但 和 (奇数)不起作用。* 可用于将字符串文字(如值)括起来。''
'
''''
''
''''''
'''
'
'''
'''''
''
*不要用于包围字符串文字,因为根据我的实验存在错误。""
*不要使用标识符,因为根据我的实验,有时无法正常工作。''
例如,您可以创建如下图所示:my"table
my"column
CREATE TABLE "my""table" (
"my""column" TEXT
);
艺术
CREATE TABLE [my"table] (
[my"column] TEXT
);
艺术
CREATE TABLE `my"table` (
`my"column` TEXT
);
然后,您可以插入一行 for to,如下所示:my"value
my"column
my"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'table
my'column
CREATE TABLE "my'table" (
"my'column" TEXT
);
艺术
CREATE TABLE [my'table] (
[my'column] TEXT
);
艺术
CREATE TABLE `my'table` (
`my'column` TEXT
);
然后,您可以插入一行 for to,如下所示:my'value
my'column
my'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`;
下一个:SQL注入修改表
评论