mysql:为什么要比较a';字符串';对0的回答是真的吗?
我在做一些MySQL测试查询,并意识到将字符串列与mysql:为什么要比较a';字符串';对0的回答是真的吗?,mysql,string,comparison,Mysql,String,Comparison,我在做一些MySQL测试查询,并意识到将字符串列与0(作为一个数字)进行比较会得到TRUE select 'string' = 0 as res; -- res = 1 (true), UNexpected! why!??!?! 但是,将其与任何其他数字(正数或负数、整数或小数)进行比较,会得到预期的false (当然,除非字符串是数字的字符串表示形式) 当然,将字符串与'0'作为字符串进行比较会得到false,这与预期的一样 select 'string' = '0' as res; --
0
(作为一个数字)进行比较会得到TRUE
select 'string' = 0 as res; -- res = 1 (true), UNexpected! why!??!?!
但是,将其与任何其他数字(正数或负数、整数或小数)进行比较,会得到预期的false
(当然,除非字符串是数字的字符串表示形式)
当然,将字符串与'0'
作为字符串进行比较会得到false,这与预期的一样
select 'string' = '0' as res; -- res = 0 (false), expected
但是为什么'string'=0
这是为什么?这意味着为了将字符串与数字进行比较,它会尝试从字符串的开头解析数字。在本例中,没有数字,因此它转换为0,0=0为真。MySQL自动将字符串转换为数字:
SELECT '1string' = 0 AS res; -- res = 0 (false)
SELECT '1string' = 1 AS res; -- res = 1 (true)
SELECT '0string' = 0 AS res; -- res = 1 (true)
不以数字开头的字符串计算为0:
SELECT 'string' = 0 AS res; -- res = 1 (true)
当然,当我们尝试将一个字符串与另一个字符串进行比较时,没有转换:
SELECT '0string' = 'string' AS res; -- res = 0 (false)
但我们可以使用,例如+运算符强制转换:
SELECT '0string' + 0 = 'string' AS res; -- res = 1 (true)
上一个查询返回TRUE,因为我们将字符串“0string”与数字0求和,因此该字符串必须转换为数字,它变为SELECT 0+0='string'
,然后字符串“string”在与0比较之前再次转换为数字,然后变为SELECT 0=0
,这是TRUE
这也将有助于:
SELECT '1abc' + '2ef' AS total; -- total = 1+2 = 3
并将返回转换为数字的字符串的总和(在本例中为1+2)。如果要修复它,可以比较两个字符串:
select 'string' = convert(0,char) as res --- res = 0
MySQL必须将字符串转换为数字或将数字转换为字符串。如果它将“字符串”转换为数字,则可能会返回
0
。所以0=0
。我明白了!我相信它会尝试另一种方法,将0解析为字符串,然后进行比较。谢谢你介意详细说明最后一个例子吗?还不清楚为什么它是真的。@DiegoDD请查看我的更新答案,如果有任何不清楚的地方,请告诉我
select 'string' = convert(0,char) as res --- res = 0