2016-05-29 93 views
8

我有一个表称为tabela1512823699024883看起来像这样: enter image description hereMySQL的展示奇怪的结果

在我运行这样的查询:

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

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

+3

我想,mysql试图将string'male'转换为int ..这将是0,并返回结果,其中'age = 0' –

+1

我希望这些截图中不是真正的用户数据? – Bergi

回答

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'; 
+0

非常好的解释和很好的例子。 – pbalazek

+0

接受,因为它不仅给出了很好的解释,而且还解决了从表中返回精确值的问题。伟大的工作人! – Ognj3n

11

试试这个简单的查询:

SELECT 'male' + 0 

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

同样的事情发生在您的查询中。 'male'转换为0时,与int类型的字段进行比较。

3

“男”是0!所以你一直得到记录,其中年龄为0。要真正了解发生了什么,只是做:

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

你的第三列将是1对含有“0”时代的记录,和“0”不含记录 - 零年龄。

2

这里的问题是,每当你尝试比较字符串到整数列,该值将被转换为列的数据类型。同样的情况下将与浮动,大INT,微小INT等情况的发生

什么都值相比首先被MySQL的引擎

这里投给特定的数据类型是通过测试查询的结果转换很少的值。

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); 

Result of casting few data types

SELECT * FROM `test_type` WHERE flt = 'test' 

Here flt is float type column.

的FLT是浮子类型的列。