【问题标题】:mySQL returns all rows when field=0当 field=0 时,mySQL 返回所有行
【发布时间】:2011-12-14 10:06:21
【问题描述】:

我正在做一些测试,当我查询一个表时,这是一个惊喜,查询SELECT * FROM table WHERE email=0返回了表中的所有行。

此表没有“0”值,并且填充了常规电子邮件。

为什么会这样?这可能会导致严重的安全问题。

有没有办法在不修改查询的情况下避免这种情况?

我错过了什么吗?

谢谢。

【问题讨论】:

    标签: mysql select where-clause


    【解决方案1】:

    电子邮件字段可能是字符,并且您正在匹配数值。

    试试看,

    SELECT * FROM table WHERE email='0';
    

    【讨论】:

      【解决方案2】:

      如果您想获取电子邮件列不应为空或为空的所有记录,则可以使用

      SELECT * FROM table WHERE email IS NOT NULL;
      

      【讨论】:

        【解决方案3】:

        您的email 列是CHARVARCHAR 类型。当您使用条件email = 0 时,MySQL 会将email 列的内容转换为整数,以便将它们与您提供的 0 进行比较。如果您将 0 括在引号中,则查询将按预期工作。 (email = '0')

        在 MySQL 中将非数字字符串转换为整数会得到 0。

        mysql> SELECT CAST('email@example.com' AS SIGNED);
        +-------------------------------------+
        | CAST('email@example.com' AS SIGNED) |
        +-------------------------------------+
        |                                   0 |
        +-------------------------------------+
        

        相比之下,如果您尝试对数字字符串进行相同的操作,它们可能会正确转换:

        mysql> SELECT CAST('12345' AS SIGNED);
        +-------------------------+
        | CAST('12345' AS SIGNED) |
        +-------------------------+
        |                   12345 |
        +-------------------------+
        

        【讨论】:

          【解决方案4】:

          这是因为它将电子邮件字段(我假设是 varchar 字段)转换为整数。任何没有有效整数的字段都将等于 0。您应该确保仅将字符串字段与字符串值进行比较(日期也是如此,与日期进行比较)。查询应该如下。

          SELECT * FROM table WHERE email='0';
          

          【讨论】:

          • 你认为mysql应该这样工作吗?我认为这是很容易引入错误的地方。我不明白为什么它需要做这种没有意义的转换,比如将任何字符串转换为 0。为什么不更好地将 0 转换为 '0' - 它会更有意义
          猜你喜欢
          • 2016-02-21
          • 2015-01-22
          • 2014-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-23
          • 2012-10-27
          • 2017-10-27
          相关资源
          最近更新 更多