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博客
相关文章:

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_nam…...
【Python】gevent模块实现协程模拟高并发
Python中GIL的存在,导致多线程一直不是很好用,相形之下,协程的优势就更加突出了。 Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。 gevent是第三方库,通过gr…...

leetcode:2485. 找出中枢整数(python3解法)
难度:简单 给你一个正整数 n ,找出满足下述条件的 中枢整数 x : 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中…...

asp.net core mvc之模型绑定、特性约束模型绑定、模型验证(服务器/客户端/远程)
一、不用模型绑定 数据类型都是string 1、UserController.cs public class UserController : Controller {public IActionResult Register(){return View();}[HttpPost]public IActionResult DoRegister(){//不用模型绑定 以前的方法取表单数据或Url的参数//数据类型都是s…...
AI诈骗防范:保护数字社会的安全前线
引言: 在当今数字化的时代,人工智能技术在各个领域都展现了巨大的潜力,然而,正是这些技术的广泛应用也催生了新的安全隐患。近期,AIGC在聊天、写作、绘画、编程等领域表现出色,但也被用于“AI换脸”、“AI换…...

(待完善)python学习参考手册
这里写目录标题 观前浅谈:学习路线 :学习心得笔记:Step1:简单但一问不知怎么的组织语言去回答的小问题:什么是提示符?python解释器是什么?请正在阅读本文的朋友,安装一下PyCharm以及如何进行科学的省钱:Python中的命令行模式和交互模式的区别是什么?请正在阅读本文的朋友安装…...

STM32-HAL库09-CAN通讯(loopback模式)
一、所用材料: STM32F103C6T6最小系统板 STM32CUBEMX(HAL库软件) MDK5 串口调试助手 二、所学内容: 初步学习如何使用STM32的CAN通讯功能,在本章节主要达到板内CAN通讯的效果,即32发送CAN信息再在CAN接收…...

jsvascript使用dhtmlXTreeObject的loadJSONObject绘制目录树
文章目录 1,引入dhtmlXTreeObject的css和js文件2,创建一棵目录树2.1,let tree new dhtmlXTreeObject(id-dhtmltree-0, "100%", "100%", 0);2.2,设置图片根目录(后续使用到的图片都是相对于该目录…...

LeetCode 17. 电话号码的字母组合 中等
题目 - 点击直达 1. 17. 电话号码的字母组合 中等1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 3. 知识与收获 1. 17. 电话号码的字母组合 中等 1. 题目详情 1. 原题链接 LeetCode 17. 电话号码的字母组合 中等 2. 题目要…...
《GPT与AI助手:技术进步与就业前景》
随着人工智能的迅速发展,像GPT(Generative Pre-trained Transformer)这样的自然语言处理技术已经广泛应用于各个领域,各个互联网公司也纷纷推出了自己的AI助手来帮助创作、交流和解决问题。这一技术的广泛应用引发了一系列关于就业…...

线性代数 | 矩阵运算 加减 数乘 矩阵的幂运算
文章目录 1 矩阵加减和数乘2 矩阵与矩阵的乘法2.1 相乘条件:看中间,取两头2.2 相乘计算方法 3 矩阵的幂3.1 观察归纳法3.2 邻项相消法3.3 化为对角 4 判断是否可逆(证明题或者要求求出逆矩阵)4.1 直接观察4.2 由定义式推得4.2.1 待…...

Linux---(五)三大工具yum、vim、gcc/g++
文章目录 一、yum工具1.Linux中安装软件的方法:2.什么是yum?3.yum源更新 二、Linux编辑器--vim1.IDE例子2.vim(1)vim的常用模式及切换模式(2)底层模式常用命令(3)插入模式常用命令(…...

网络通信TCP、UDP详解
目录 IP 和端口 网络传输中的 2 个对象:server 和 client 两种传输方式:TCP/UDP TCP 和 UDP 原理上的区别 为何存在 UDP 协议 TCP/UDP 网络通信大概交互图 IP 和端口 所有的数据传输,都有三个要素 :源、目的、长度。 怎么表…...

Flutter笔记:绘图示例 - 一个简单的(Canvas )时钟应用
Flutter笔记 绘图示例 - 一个简单的(Canvas )时钟应用 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_2855…...
Bard和ChatGPT的一些比较
Bard和ChatGPT的一些比较 2023.11.8版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 选择正确的自动文本生成工具对企业至关重要。本文将详细分析谷歌 Bard 和 ChatGPT 的优缺点,以帮助企业做出明智的选择。无论企业关注的是客…...

centos7安装Nexus(Maven私服)与配置使用教程
之前有位大佬问我,他说有个第三方的Jar包,在idea导出库中使用,现在要部署上线测试,要如何导进去打包。 我说,不用那么麻烦,搞个Nexus私服,将Jar上传上去,然后配置Maven的setting文件…...

Azure 机器学习 - 有关为 Azure 机器学习配置 Kubernetes 群集的参考
目录 受支持的 Kubernetes 版本和区域建议的资源计划ARO 或 OCP 群集的先决条件禁用安全增强型 Linux (SELinux)ARO 和 OCP 的特权设置 收集的日志详细信息Azure 机器学习作业与自定义数据存储连接支持的 Azure 机器学习排斥和容许最佳实践 通过 HTTP 或 HTTPS 将其他入口控制器…...

使用微信小程序控制蓝牙小车(微信小程序端)
目录 使用接口界面效果界面设计界面逻辑设计 使用接口 微信小程序官方开发文档 接口说明wx.openBluetoothAdapter初始化蓝牙模块wx.closeBluetoothAdapter关闭蓝牙模块(调用该方法将断开所有已建立的连接并释放系统资源)wx.startBluetoothDevicesDiscovery开始搜寻附近的蓝牙…...
【react hook】react hook组件中,在forEach中使用async/awati进行异步操作,为什么后面代码没有等待直接同步运行了呢?
这是因为 forEach 方法不会等待 async/await 异步操作的完成。forEach 方法是一种同步的方法,它会在每个迭代内部同步执行一个回调函数。当遇到 await 时,会立即暂停执行,但是 forEach 方法不会等待回调函数中的 await 异步操作完成ÿ…...

高斯过程回归 | GPR高斯过程回归
高斯过程回归(Gaussian Process Regression, GPR)是一种强大的非参数回归方法,它通过假设数据是从一个高斯过程中生成的来预测新的数据点。 高斯过程是一种定义在连续输入空间上的随机过程,其中任何有限集合的观测值都呈多变量高斯分布。 实现GPR的Python代码import numpy …...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
用js实现常见排序算法
以下是几种常见排序算法的 JS实现,包括选择排序、冒泡排序、插入排序、快速排序和归并排序,以及每种算法的特点和复杂度分析 1. 选择排序(Selection Sort) 核心思想:每次从未排序部分选择最小元素,与未排…...

【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...

二维数组 行列混淆区分 js
二维数组定义 行 row:是“横着的一整行” 列 column:是“竖着的一整列” 在 JavaScript 里访问二维数组 grid[i][j] 表示 第i行第j列的元素 let grid [[1, 2, 3], // 第0行[4, 5, 6], // 第1行[7, 8, 9] // 第2行 ];// grid[i][j] 表示 第i行第j列的…...