【问题标题】:Error when replacing words that contain quotes in mySQL替换 mySQL 中包含引号的单词时出错
【发布时间】:2009-09-11 09:07:33
【问题描述】:

我已经更新了很多记录,但是当涉及到一个包含引号的单词时,我得到了这个错误:“错误:未闭合的引用 @ 1357”

我知道它为什么给我这个错误,我只是不知道如何解决它。

这是一个示例: 更新 invnum SET cAccountName = replace(cAccountName,'JOHN'S','BEN')

提前致谢。

【问题讨论】:

    标签: sql mysql sql-injection


    【解决方案1】:

    字符串中的转义引号:

    UPDATE invnum SET cAccountName = replace(cAccountName,'JOHN\'S','BEN')
    

    您需要非常小心 - 处理不当是SQL injection attacks 的根源,也是安全问题的主要根源。

    【讨论】:

      【解决方案2】:

      如果您使用脚本更新记录,请使用内置转义函数。对于 php 那将是 mysql_real_escape_string

      【讨论】:

        【解决方案3】:

        试试这个:

        UPDATE invnum SET cAccountName = replace(cAccountName,"JOHN'S","BEN")
        

        如果你需要在一个字符串中同时使用这两种类型的引号,那么当它们出现在字符串中时,你需要转义你用来包围字符串的引号类型(否则 SQL 解释器会认为字符串在它之前结束确实如此。

        例如:

        Johns   becomes "Johns"
        John's  becomes "John's" or 'John\'s'
        "John"  becomes '"John"' or "\"John\""
        

        等等。

        【讨论】:

        • 谢谢。我想选择第二个选项,但我应该使用什么:“John's”或“John\'s” - 这有关系吗?
        • 任何一个都可以 - 关键是您必须选择一种引号类型来包围您的字符串,然后如果您还需要使用您在字符串中选择的任何类型,您将必须逃脱它。因此,如果您只在字符串中使用一种类型的引号,那么选择另一种类型来将其括起来会很方便,因为您不需要转义。
        • 这只能在 mysql 中实现。其他数据库服务器不支持这种混合引用样式。
        • @longneck:OP 询问的是 MySQL。
        猜你喜欢
        • 2016-09-08
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 2023-03-30
        • 2013-03-20
        • 2012-05-17
        • 2012-06-11
        相关资源
        最近更新 更多