【发布时间】:2012-01-31 14:50:29
【问题描述】:
我有一个包含撇号和逗号的字符串,当我执行插入 SQLite 时 它给了我错误,例如这样的字符串:
...., 'The Smiths - I Know It's Over', .....
"Over": syntax error Unable to execute statement
我该如何或我可以做些什么来将撇号保留在字符串中但预先形成有效的插入? 我正在使用 Qt c++。
【问题讨论】:
我有一个包含撇号和逗号的字符串,当我执行插入 SQLite 时 它给了我错误,例如这样的字符串:
...., 'The Smiths - I Know It's Over', .....
"Over": syntax error Unable to execute statement
我该如何或我可以做些什么来将撇号保留在字符串中但预先形成有效的插入? 我正在使用 Qt c++。
【问题讨论】:
您不应该将任意字符串直接放入 SQL 中 - 那是要求 injection attack。相反,使用bound parameters;类似:
sqlite3_stmt * statement;
sqlite3_prepare(db, "select * from students where name=?", -1, &statement, NULL);
sqlite3_bind_text(statement, 1, "'; drop table students --", -1, SQLITE_STATIC);
sqlite3_step(statement);
sqlite3_finalize(statement);
这会将查询中的第一个参数 (?) 替换为给定的字符串,不会有任何' 字符被解释为字符串结尾或字符串的任何部分被执行为SQL。
【讨论】:
来自FAQ:
(14) 如何使用包含嵌入式单引号 (') 字符的字符串文字?
SQL 标准指定字符串中的单引号通过将两个单引号放在一行中来进行转义。在这方面,SQL 的工作方式类似于 Pascal 编程语言。 SQLite 遵循这个标准。示例:
INSERT INTO xyz VALUES('5 O''clock');
【讨论】:
我相信 mysql 库有一个名为 mysql_real_escape_string 的函数来转义字符串。此外,您可以使用双引号将字符串括起来或转义输入字符串的撇号,例如'The Smiths - I Know It\'s Over',
【讨论】: