【问题标题】:Adding apostrophes into queries在查询中添加撇号
【发布时间】:2010-11-26 02:25:33
【问题描述】:

我有一个查询,它从文本框中获取文本并将其输入到数据库中。

如果该值类似于Taylor,则它可以正常工作,但是当它是O'Neill 时会出错,因为撇号会给出语法错误unclosed quotation mark

有没有办法将O'Neill 添加到数据库中,但撇号仍然存在?

我不想用双单引号替换它,我希望它按照它显示的那样放入数据库中。

谢谢

【问题讨论】:

  • 你能贴出你用来将数据插入数据库的代码吗?

标签: asp.net syntax apostrophe


【解决方案1】:

如果您使用双单引号,您的数据库中不会出现双单引号。您将得到只有一个单引号

双引号只是在SQL语句中ESCAPE单引号的一种方式。因此,当您执行以下操作时:

> insert into your_table (name) values ('O''neil');

O'neil 的值实际上会被插入到数据库中。

如果您的数据库是 PostgreSQL,还有其他操作字符串的方法。例如使用$$:

> insert into your_table (name) values ($$O'neil$$);

将在数据库中插入O'neil

【讨论】:

    【解决方案2】:

    您可能需要查看this document by Microsoft patterns & practices 中的第 4 步。使用 SQL 查询的命令参数。这不仅可以解决您的报价问题,还可以防止 SQL 注入攻击和其他 Very Bad Things™ 的发生。

    【讨论】:

    • 使用参数对我来说并不是一个真正的选择,现在我从别人的工作中编辑的所有当前查询都使用 openquery 并且没有参数我不想重新编写整个页面 atm,但 +1 获取有关 SQL 注入的信息
    【解决方案3】:

    您可以通过将撇号加倍 ('') 来避开撇号 - 将插入一个撇号。

    因此,插入O''Neill 将导致O'Neill 插入到数据库中。

    但是,您需要这样做表明您正在使用对SQL Injection Attacks 开放的嵌入式 SQL。

    如果您使用parameterized queries,您将不会那么容易受到攻击,也无需求助于转义撇号。

    【讨论】:

    • 他/她在问题中提到了这一点。
    • @Pablo - 转义它在数据库中插入一个单引号。
    • @Pablo - 我的意思是他认为转义会导致插入 两个 撇号。这个假设是不正确的。
    【解决方案4】:

    你可以用双''提交你的SQL查询就好了,数据库识别转义字符并只保存一个。

    为什么你不想要双单引号解决方案?

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 2019-06-27
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 1970-01-01
      相关资源
      最近更新 更多