当前位置: 首页 > news >正文

mysql隐式转换转换引起的bug

生产环境中遇到一个情况情况 ,过滤数据发现过滤不掉相关值情况,具体情况如下

原始数据:

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博客

http://www.lryc.cn/news/225336.html

相关文章:

  • 【Python】gevent模块实现协程模拟高并发
  • leetcode:2485. 找出中枢整数(python3解法)
  • asp.net core mvc之模型绑定、特性约束模型绑定、模型验证(服务器/客户端/远程)
  • AI诈骗防范:保护数字社会的安全前线
  • (待完善)python学习参考手册
  • STM32-HAL库09-CAN通讯(loopback模式)
  • jsvascript使用dhtmlXTreeObject的loadJSONObject绘制目录树
  • LeetCode 17. 电话号码的字母组合 中等
  • 《GPT与AI助手:技术进步与就业前景》
  • 线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算
  • Linux---(五)三大工具yum、vim、gcc/g++
  • 网络通信TCP、UDP详解
  • Flutter笔记:绘图示例 - 一个简单的(Canvas )时钟应用
  • Bard和ChatGPT的一些比较
  • centos7安装Nexus(Maven私服)与配置使用教程
  • Azure 机器学习 - 有关为 Azure 机器学习配置 Kubernetes 群集的参考
  • 使用微信小程序控制蓝牙小车(微信小程序端)
  • 【react hook】react hook组件中,在forEach中使用async/awati进行异步操作,为什么后面代码没有等待直接同步运行了呢?
  • 高斯过程回归 | GPR高斯过程回归
  • [autojs]逍遥模拟器和vscode对接
  • Docker 安装与优化
  • Wix使用velo添加Google ads tag并在form表单提交时向谷歌发送事件
  • Centos配置邮件发送
  • Ubuntu系统使用apt-get管理软件工具
  • 带你走进Cflow (三)·控制符号类型分析
  • FPGA UDP RGMII 千兆以太网(3)ODDR
  • OSG交互:选中场景模型并高亮显示
  • 农业大棚智能化改造升级与远程视频监管方案,助力智慧农业建设发展
  • P6入门:项目初始化2-项目详情之日期Date
  • 【ubuntu20.04】win10安装ubuntu20.04双系统