生产环境中遇到一个情况情况 ,过滤数据发现过滤不掉相关值情况,具体情况如下
原始数据:
CREATE TABLE `test` (`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',`subject_id` bigint(11) NOT NULL DEFAULT '0' COMMENT '主题id',`subject_name` varchar(255) NOT NULL DEFAULT '' COMMENT '主题名称',`is_deleted` tinyint(2) NOT NULL DEFAULT '0' COMMENT '该条数据是否删除 ,0:否,1:是',`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (3, 0, '测试分析导出', 1, '2023-10-31 14:26:17', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (4, 0, '主题58', 1, '2023-11-02 11:06:50', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (5, 0, '销售分析', 0, '2023-11-02 11:30:41', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (6, 0, '流量分析', 0, '2023-11-02 11:31:39', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (7, 0, '购物车分析', 1, '2023-11-02 11:32:10', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (8, 0, '兴趣收藏分析', 1, '2023-11-02 11:32:43', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (9, 0, '商品曝光分析', 1, '2023-11-02 11:33:13', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (10, 0, '在线货品分析', 1, '2023-11-02 11:33:41', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (11, 0, '优惠券分析', 1, '2023-11-02 11:34:12', '2023-11-10 11:00:15');
INSERT INTO `test` (`id`, `subject_id`, `subject_name`, `is_deleted`, `create_time`, `update_time`) VALUES (13, 0, 'presto测试查询', 0, '2023-11-09 18:29:34', '2023-11-10 11:00:15');
进行查询的时候发现不应该查询出来的数据,竟然出现了
问题原因及避免
1、原因: 当MySQL字段类型和传入条件数据类型不一致时,会进行隐形的数据类型转换(MySQL Implicit conversion)
2、若字符串是以数字开头,且全部都是数字,则转换为数字结果是整个字符串;部分是数字,则转换为数字结果是截止到第一个不是数字的字符为止。 理解: varchar str = "123dafa",转换为数字是123 。 SELECT '123dafa'+1 ; --- 124 。
3、若字符串不是以数字开头,则转换为数字结果是 0 。 varchar str = "aabb33" ; 转换为数字是 0 。 SELECT 'aabb33'+100 ; --- 100 。
本案例正好符合第三种情况,因为subject_id是int类型,而过滤条件是varchar类型,同时首字母是英文而不是数字,导致默认转换为0,所以查询出来不一样的结果
参考文章
MySQL 字符串类型用数字可以查出来 MySQL字符串类型会转换成数字 MySQL隐式类型转换_mysql存的是字符串只能用数字查-CSDN博客