mysql:为什么要比较a';字符串';对0的回答是真的吗?

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

我在做一些MySQL测试查询,并意识到将字符串列与
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