MySQL将字符串视为整数

时间:2014-09-27 13:36:42

标签: php mysql

我的申请存在很大问题。在开始之前,我会将这些主题Mysql treating varchar as int bug?mysql autocasting string to integer红色。

我的表:

CREATE TABLE `srv_table` (
  `srv_id` int(11) NOT NULL AUTO_INCREMENT,
  `srv_code` char(4) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`srv_id`),
  UNIQUE KEY `code` (`srv_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我尝试按主键选择行并发送混合字符串时,它会返回结果。例如:

SELECT * FROM srv_table WHERE srv_id='2sadf'

将返回与:

相同的结果
SELECT * FROM srv_table WHERE srv_id=2

我知道这是在MySQL中记录的,但是我找不到如何避免这种情况。是否有设置或其他我可以做的而不更改我的代码和查询

问候。

更新 对于那些不相信的人,当id值被单引号包装时,它会返回相同的结果:

SQL fiddle

更新2:

这似乎不是PostgreSQL中的一个问题: PgSQL fiddle

4 个答案:

答案 0 :(得分:2)

您期望发生什么?您有一个整数列,并将其与字符串进行比较。这是个坏主意。 MySQL使用静默转换将两者转换为整数(即​​,它转换前导数字)。

如果你真的想这样做,那就使用显式转换:

SELECT *
FROM srv_table 
WHERE cast(srv_id as varchar) = '2sadf';

但这似乎是一个坏主意。将整数字段与整数进行比较,而不是字符串。

答案 1 :(得分:1)

您可以使用LIKE,但最好的方法是确保从您的数据传递整数值。请尝试以下代码:

SELECT * FROM srv_table WHERE srv_id LIKE '2'

答案 2 :(得分:1)

您是否尝试在SQL查询中使用“BINARY”?

SELECT * FROM srv_table WHERE BINARY srv_id='2sadf'
上面的

查询将返回空行,因为'srv_id'列是整数。

答案 3 :(得分:1)

试试这个: -

SELECT * FROM `srv_table` WHERE  binary(`srv_id`) = '3ххххх';

希望它会对你有所帮助。