【问题标题】:How to replace apostrophe with double apostrophe in string?如何用字符串中的双撇号替换撇号?
【发布时间】:2011-10-12 22:33:57
【问题描述】:

我有一个字符串

good overview of ESP's in more detail than you probably need.

插入 SQL 表时出错。所以我想用像

这样的双撇号替换字符串中的撇号

good overview of ESP''s in more detail than you probably need

如何在 c# 中进行操作?

【问题讨论】:

  • 你应该使用你的数据库转义函数。如果你不这样做,你可能会让自己容易受到 SQL 注入的影响。 stackoverflow.com/questions/249567/…
  • 或者,更好的是:参数化查询。

标签: c# sql


【解决方案1】:

很简单:

string s = "good overview of ESP's in more detail than you probably need.";
string escaped = s.Replace("'","''");

注意:使用命令参数通常更安全。特别是如果输入字符串的值不受您的代码控制(即用户条目)。

【讨论】:

  • 虽然这在技术上是正确的,但它却将最初的提问者引向了错误的方向。更好地使用适当的参数并避免 SQL 注入漏洞。
  • 如果字符串被转义,注入仍然会发生吗?据我了解,注入通过使用单个撇号过早地终止了 sql。
【解决方案2】:

使用 Parameter 对象。

  myCommand.InsertCommand.Parameters.Add("@myString", SqlDbType.VarChar, 200);
  myCommand.InsertCommand.Parameters["@myString"].Value = @"good overview of ESP's in more detail than you probably need.";

【讨论】:

    【解决方案3】:

    我多年来一直在研究这个问题。在客户端上做,用两个单引号替换单引号。如果您正在执行带有多个 varchar 输入参数的 sp,则此方法有效。唯一的问题是 SQL 注入,即人们可以在客户端看到你在做什么,这绝不是一件好事。解决这个问题的唯一方法是在服务器上使用 SQLparameters,正如他们之前所说的那样。

    【讨论】:

      【解决方案4】:

      String.Replace(String,String) 应该可以正常工作。在此示例中,您需要:

      String.Replace("'", "''")
      

      但是,我认为这不会解决您的问题。我想你更适合寻找:

      String.Replace("'", "\'")
      

      原因是 MySQL 和我想象的其他 SQL 版本都希望字符串用单引号括起来。

      【讨论】:

      • 我同意这直接回答了这个问题,但它会帮助 OP 进行不良做法。如果使用参数化查询,这个问题就会消失,并且他们采用防止注入攻击、协助执行计划缓存等的做法。
      • @dambrisco:一些 SQL 方言使用双撇号 ('') 而不是您为 MySQL 建议的转义序列 (\')。
      • @Dems - 我完全同意,但是,鉴于这个问题,我认为采取婴儿步骤可能会更好。向似乎不了解转义序列的人解释参数化可能是一个不好的起点。不过无论如何,使用 Daok 的解决方案比我的要好得多。
      • @Olivier Jacot-Descombes - 在某些方言中,撇号的转义序列是双撇号吗?我对这个想法有点傻眼,所以我只希望有一些实际的原因,而不是我认为更容易解析的东西。
      【解决方案5】:

      myCommand.InsertCommand.Parameters.Add("@myString", SqlDbType.VarChar, 200); myCommand.InsertCommand.Parameters["@myString"].Value

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-06
        • 1970-01-01
        • 2021-11-12
        • 2013-06-08
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        相关资源
        最近更新 更多