MySQL显示奇怪的结果

时间:2016-05-29 08:25:41

标签: php mysql

我有一个名为tabela1512823699024883的表,如下所示: enter image description here

我在其上运行如下查询:

SELECT * FROM tabela1512823699024883 WHERE `age` = 'male'

此查询没有意义,因为age列是int类型,我在查询中查找string值,但MySQL仍然返回没有任何空行。以下是返回的查询: enter image description here 因此age行在返回的行中都不包含male值。这怎么可能?

4 个答案:

答案 0 :(得分:14)

将字符串转换为整数类型时会出现同样的问题。

SELECT CAST('male' as SIGNED); #0
#or
SELECT CAST('male' as UNSIGNED); #0

但是如果在字符串中提供了数字。

SELECT CAST('1234male' as UNSIGNED); #1234
#and
SELECT CAST('male1234' as UNSIGNED); #0

要解决此问题,请在列上使用BINARY,这也会导致文本值区分大小写。

SELECT * FROM tabela1512823699024883 WHERE BINARY `age` = 'male';

答案 1 :(得分:11)

尝试这个简单的查询:

SELECT 'male' + 0

这似乎没有意义。但是,查询将执行并返回值0。这是因为隐式类型转换。字符串值'male'转换为0,然后添加到0,然后返回0

您的查询也会发生同样的事情。与'male'类型的字段相比,0已转换为int

答案 2 :(得分:3)

“男性”为0!因此,您不断获得年龄为0的记录。要真正了解正在发生的事情,请执行以下操作:

select user_name, age, age='male' from tabela1512823699024883;

对于包含“0”年龄的记录,您的第3列将为1;对于包含非零年龄的记录,您的第3列将为“0”。

答案 3 :(得分:2)

  
    

这里的问题是,无论何时尝试将字符串与整数列进行比较,该值都将转换为列的数据类型。 float,big int,tiny int等也会发生同样的情况。

  

通过mysql引擎首次为特定数据类型强制转换时传递的值是什么

以下是查询投射少量值的测试结果。

CountDownTimer

Result of casting few data types

select cast('' AS UNSIGNED), cast('anything' AS UNSIGNED), cast(NULL AS UNSIGNED), cast(35.56 AS UNSIGNED), cast(NOW() AS UNSIGNED), cast(1 AS UNSIGNED), cast('Test' AS BINARY), cast('' AS BINARY);

Here flt is float type column.

flt是浮点型列。