我有一个表称为tabela1512823699024883
看起来像这样: MySQL的展示奇怪的结果
在我运行这样的查询:
SELECT * FROM tabela1512823699024883 WHERE `age` = 'male'
这个查询是没有意义的,因为age
列int
类型,我在查询中查找string
值,但MySQL
仍然返回任何空行。这是什么查询返回: 因此age
行不包含male
值在任何行中都不返回。这怎么可能?
我有一个表称为tabela1512823699024883
看起来像这样: MySQL的展示奇怪的结果
在我运行这样的查询:
SELECT * FROM tabela1512823699024883 WHERE `age` = 'male'
这个查询是没有意义的,因为age
列int
类型,我在查询中查找string
值,但MySQL
仍然返回任何空行。这是什么查询返回: 因此age
行不包含male
值在任何行中都不返回。这怎么可能?
将字符串强制转换为整数类型会发生同样的问题。
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';
试试这个简单的查询:
SELECT 'male' + 0
这似乎没有什么意义。但是,查询执行并返回值0
。这是因为隐式类型转换。字符串值'male'
被转换为0
,然后被添加到0
,因此0
被返回。
同样的事情发生在您的查询中。 'male'
转换为0
时,与int
类型的字段进行比较。
“男”是0!所以你一直得到记录,其中年龄为0。要真正了解发生了什么,只是做:
select user_name, age, age='male' from tabela1512823699024883;
你的第三列将是1对含有“0”时代的记录,和“0”不含记录 - 零年龄。
这里的问题是,每当你尝试比较字符串到整数列,该值将被转换为列的数据类型。同样的情况下将与浮动,大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);
SELECT * FROM `test_type` WHERE flt = 'test'
的FLT是浮子类型的列。
我想,mysql试图将string'male'转换为int ..这将是0,并返回结果,其中'age = 0' –
我希望这些截图中不是真正的用户数据? – Bergi