如何处理SQL中的引号'

时间:2020-03-05 18:43:43  来源:igfitidea点击:

我有一个数据库,其中有一些名称,例如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}'