Mysql 如果字段是数字,WHERE子句是字符串,为什么查询会返回结果?

Mysql 如果字段是数字,WHERE子句是字符串,为什么查询会返回结果?,mysql,sql,database,Mysql,Sql,Database,我在一个db表上运行一个查询,该表返回一条记录,而我希望它不返回任何记录 SELECT yeargroupID FROM tbl_yeargroup WHERE yeargroup='S' AND schoolID=2. yeargroup字段是一个小字段。在WHERE子句之前,它正在数字字段中查找字母“S”,因此不应找到任何内容。但它返回的记录的yeargroup=0,yeargroupID=17(表中的底部记录) 我不明白为什么它会退回这张唱片,以及如何避免它 谢谢正如您所指出的,这个逻

我在一个db表上运行一个查询,该表返回一条记录,而我希望它不返回任何记录

SELECT yeargroupID FROM tbl_yeargroup WHERE yeargroup='S' AND schoolID=2.
yeargroup字段是一个小字段。在WHERE子句之前,它正在数字字段中查找字母“S”,因此不应找到任何内容。但它返回的记录的yeargroup=0,yeargroupID=17(表中的底部记录)

我不明白为什么它会退回这张唱片,以及如何避免它


谢谢

正如您所指出的,这个逻辑是比较数字和字符串:

WHERE yeargroup = 'S' 
处理这种情况是大多数SQL编译器的一个重要组成部分,而且非常好。解决方案是隐式地将值转换为“一致”类型。这是可悲的。我的偏好是编译器生成错误并强制用户使用正确的类型。我发现隐式转换产生的问题比它解决的问题多

在任何情况下,本例中的规则都非常简单。字符串被转换为整数。但是,没有数字的字符串如何转换?MySQL中的规则是将前导数字转换为数字。如果没有,则值为
0
。这就变成了:

where yeargroup = 0
如果运行以下命令,您可以更清楚地看到结果:

select 'S', 'S' + 0
请注意,在这种情况下,大多数数据库都会返回错误(类型转换错误)。但是,如果字符串看起来像一个数字,那么即使这些字符串也会接受,因此这是允许的:

where yeargroup = '5'

正确的解决方案是什么?永远不要混用。不要通过使用常量值构造查询。相反,来自应用程序的查询应该始终使用参数。

您可以通过不比较字符串和数字来避免它。阅读以下内容:因为它将字符串转换为int,得到0。很高兴知道-谢谢。我找到了一个方法,可以测试值是否为非数值,并调整查询。因为MySQL更喜欢做“某事”而不是抛出错误(即使“某事”没有意义)。处理这种情况有三种明智的方法:抛出错误,因为比较数字和字符串没有意义(Postgres就是这样做的)。将数字转换为字符串或将字符串转换为数字,但如果字符串不是数字(例如Oracle就是这样做的),则会失败。但是MySQL选择了第四个:如果某个东西不能转换成数字,它只会假设它是零。太好了——感谢您花时间解释Gordon。