我的申请存在很大问题。在开始之前,我会将这些主题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值被单引号包装时,它会返回相同的结果:
更新2:
这似乎不是PostgreSQL中的一个问题: PgSQL fiddle
答案 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ххххх';
希望它会对你有所帮助。