如何处理SQL中的引号'
我有一个数据库,其中有一些名称,例如John Doe等。不幸的是,其中一些名称包含诸如Keiran O'Keefe之类的引号。现在,当我尝试搜索如下名称时:
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
我(可以理解)得到一个错误。
如何防止发生此错误。我正在使用Oracle和PLSQL。
解决方案
回答
在Google的30岁以下发现...
Oracle SQL常见问题解答
回答
输入过滤通常在语言级别而不是数据库层上进行。
php和.NET都有各自的转义sql语句库。检查语言,查看可用的语言。
如果数据是可信任的,那么我们只需执行字符串替换即可添加另一个'infront of'以对其进行转义。通常,如果没有任何恶意输入风险,就足够了。
回答
我想一个很好的问题是,我们使用的是哪种语言?
在PHP中,我们可以执行以下操作:SELECT * FROM PEOPLE WHERE SURNAME ='mysql_escape_string(O'Keefe)'
但是,由于我们未指定语言,因此建议我们使用mysql或者其他语言来研究转义字符串函数mysql。
回答
转义字符是',因此我们需要将引号替换为两个引号。
例如,
SELECT * FROM SEONAME WHERE SURNAME ='O'Keefe'
变成
SELECT * FROM SEONAME WHERE SURNAME ='O''Keefe'`
就是说,自己做这可能是不正确的。语言可能具有转义字符串以在SQL中使用的功能,但是更好的选择是使用参数。通常,它的工作方式如下。
SQL命令为:
SELECT * FROM PHERPLE WHERE SURNAME =?
然后,在执行它时,我们将" O'Keefe"作为参数传递。
由于SQL是在设置参数值之前进行解析的,因此无法通过参数值更改SQL的结构(如果要使用不同的参数多次运行同一条语句,它甚至会更快一些)。
我还应该指出,尽管示例仅导致错误,但由于没有适当地转义字符串,我们使自己面临许多其他问题。请参阅http://en.wikipedia.org/wiki/SQL_injection了解一个好的起点或者以下经典的xkcd漫画。
回答
正如Matt所建议的那样,参数化查询是朋友。
Command = SELECT * FROM PEOPLE WHERE SURNAME=?
他们将保护我们免受头痛困扰
- 带引号的字符串
- 使用日期查询
- SQL注入
回答
使用参数化的SQL还有其他好处,它通过减少Oracle解析该语句所需的工作量来减少Oracle中的CPU开销(以及其他资源)。如果我们不使用参数(在Oracle中我们称其为绑定变量),则将" select from from foo where bar ='cat'"和" select from from foo where bar ='dog'"视为单独的语句,其中" select * from foo,其中bar =:b1"是同一条语句,这意味着诸如语法,所引用对象的有效性等内容……无需再次检查。使用绑定变量时偶尔会出现一些问题,这些问题通常表现为没有获得最有效的SQL执行计划,但是有一些解决方法,这些问题实际上取决于我们使用的谓词,索引和数据偏斜。
回答
Oracle 10解决方案是
SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'