【问题标题】:MySQL query enclosing numbers in stringsMySQL查询将数字包含在字符串中
【发布时间】:2011-12-07 06:19:30
【问题描述】:

假设我有一个查询

SELECT * FROM table WHERE x > y;

其中“y”是用户输入值。我想用引号将 y 括起来。据我测试,添加引号后查询可以正常工作。行为是否已定义?是否已知会导致效率下降?

请注意,该查询是为简单起见而制作的示例。此外,这不是处理 SQL 注入的尝试。

【问题讨论】:

  • 您的实际问题是什么?
  • 行为是否已定义,是否已知会导致效率下降?
  • 用引号括起来的值不能防止注入。
  • 正如我所提到的,我并不是要防止注射。这只是提出问题的一种简单方法。
  • 你为什么要提到注射?

标签: mysql casting


【解决方案1】:

如果您尝试比较的字段是数字字段,即int,那么所有可能的组合都必须在 mysql 中有效

select * from users where id = 20;

select * from users where id = "20";

select * from users where id = '20';

更多深度请参考MySQL DOC

【讨论】:

    【解决方案2】:

    比较不同类型时 MySQL 的conversion 行为是明确定义的。比较字符串和数字时,两者都转换为浮点数。手册第 11.2 节对此进行了概述。

    【讨论】:

      【解决方案3】:

      IMO,你可以试试:-

      cast( "-10" as signed )
      

      这是 mysql 中的强制转换(函数名是强制转换的,很明显吗?)。

      【讨论】:

      • -2 很好,但我真的很想知道上面有什么问题?
      • 对于这个问题,有几个不受欢迎的投票。如果我不得不猜测,那是因为这个答案没有解决问题。具体来说,Wyatt 是在询问他所看到的行为是否在任何地方指定,而不是他如何确保某个值属于某种类型。或者可能不需要强制转换,因为将数字与字符串进行比较会导致浮点比较。
      • 好吧,如果反对者真的在阅读文档,他会惊讶于引用变量与强制转换没有区别,并且正确强制转换为列类型是这个问题的衡量标准。抱歉,我太自大了,这就是我对演员自然的看法。
      • 我不认为这是傲慢。不知道你所说的“这个问题的测量”是什么意思。
      • 在这个文档中定义(dev.mysql.com/doc/refman/5.1/en/type-conversion.html),很多人提到强制转换是正确的解决方案,而不是引用字符串(当然在那个文档中,有更多的例子和深入的解释)
      猜你喜欢
      • 2011-02-05
      • 2018-10-27
      • 2011-05-14
      • 1970-01-01
      • 2011-03-30
      • 2017-03-18
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多