2016-03-01 109 views
0

我正在查看一些代码,并且一些错误引起了我的注意。有人比较tinyint列和varchar值。Mysql:将tinyint列与varchar值进行比较

但令人惊讶的是,这是工作(因为意图是与数值0比较)。

示例查询:

create table t1(x1 tinyint); 

insert into t1 values (0),(0), (1), (2); 

select * from t1 where x1 = 'live' 

结果:

x1 

0 

0 

Sqlfiddle

我的问题是,为什么(任意)VARCHAR值的行为方式为数值0的相同int/tinyint列?

+0

如果您需要将varchar列与int/tinyint列进行比较,那么db设计可能有问题。 – jarlh

+0

请阅读...一个bug引起了我的注意.. – user2407394

+0

对不起,没有仔细阅读,再次... – jarlh

回答

1

MySQL在数字上下文中静静地将字符串转换为数字。

它通过将前导数字字符转换为数字来实现。如果没有数字,则值为0.

因此,这相当于x1 = 0,因为此转换。

+0

不应该mysql给错误...这是奇怪的行为.. – user2407394

+0

今天遇到这个,非常怪异的行为。我期待一个错误或至少显示一个空的结果 –

+0

@LuqmanSungkar。 。 。如果你使用'cast()',你会得到一个错误。隐式转换不会产生错误 - 有时这很方便。 –

相关问题