代码之家  ›  专栏  ›  技术社区  ›  satoru

为什么“select”a的结果=0;`1?

  •  2
  • satoru  · 技术社区  · 14 年前
    mysql> SELECT 'a'='b'='c';
    +-------------+
    | 'a'='b'='c' |
    +-------------+
    |           1 |
    +-------------+
    mysql> select 'a'=0, 'b'='c';
    +-------+---------+
    | 'a'=0 | 'b'='c' |
    +-------+---------+
    |     1 |       0 | 
    +-------+---------+
    

    为什么MySQL中的“a”等于0?

    4 回复  |  直到 14 年前
        1
  •  2
  •   jtdubs    14 年前

    通过将所有前导数字解释为数字,文本值被转换为整数值。如果没有数字,则强制转换为0。

    所以:

    '123a' = 123
    '4a' = 4
    'a' = 0
    
        2
  •  2
  •   Count Chocula    14 年前

    将字符串文字与数值进行比较时,MySQL还必须将字符串文字转换为数值,以便进行比较。由于“a”不是数字,因此结果值为零,因此相等。比较“b”和“c”时,两个操作数都是字符串,因此不会进行转换,结果为false(0)。

    代码中的第一个表达式可以重写为:

    ('a' = 'b') = 'c'
    

    因为('a'='b')返回0,所以在执行该操作之后,您的表达式将被解释为

    0 = 'c'
    

    因为我上面解释的原因,所以是1。顺便说一下,这个表达式:

    'a' = 0 = 'c'
    

    返回false,因为('a'=0)返回1,然后(1='c')返回0。

        3
  •  1
  •   Greg Hewgill    14 年前

    我相信MySQL调用 atoi() 或者类似的东西 'a' ,等于0。做什么 select 'a'=1 给?

        4
  •  1
  •   grahamparks    14 年前

    this page 在MySQL文档中。

    “b”=“c”情况受以下规则管辖:

    如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

    因为它们是不同的字符串,所以结果是错误的。

    “a”=0的情况受以下规则的约束:

    在所有其他情况下,将参数作为浮点(实数)数字进行比较

    两边都是将比较转换为浮点数,并且由于“a”不包含任何数字,因此它的计算结果为零,右侧的数字0也是如此,因此它们被视为相等。