数据库查询:查询入参类型和数据库字段类型不匹配导致的问题

问题:假设我们现在有这样的一张表

CREATE TABLE `test_person` (`id` int(20) NOT NULL COMMENT '主键',`name` varchar(20) DEFAULT NULL COMMENT '姓名',`gender` char(2) DEFAULT NULL COMMENT '性别',`birthday` date DEFAULT NULL COMMENT '生日',`created_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',`updated_time` timestamp NULL DEFAULT NULL COMMENT '修改时间',`teach_id` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表中数据:

INSERT INTO test_local.test_person
(id, name, gender, birthday, created_time, updated_time, teach_id)
VALUES(0, '暂时', '男', '2022-10-26', '2022-10-26 10:17:00', '2022-10-26 10:17:02', '1760192781263546523');
INSERT INTO test_local.test_person
(id, name, gender, birthday, created_time, updated_time, teach_id)
VALUES(1, '知识', '女', '2022-10-26', '2022-10-26 10:14:47', '2022-10-26 10:14:49', '1760192781263546578');
INSERT INTO test_local.test_person
(id, name, gender, birthday, created_time, updated_time, teach_id)
VALUES(2, '财富', '女', '2022-10-26', '2022-10-26 10:14:47', '2022-10-26 10:14:49', '1760192781263546584');
INSERT INTO test_local.test_person
(id, name, gender, birthday, created_time, updated_time, teach_id)
VALUES(3, '自由', '女', '2022-10-26', '2022-10-26 10:14:47', '2022-10-26 10:14:49', '1760192781263546545');
INSERT INTO test_local.test_person
(id, name, gender, birthday, created_time, updated_time, teach_id)
VALUES(4, '爱情', '女', '2022-10-26', '2022-10-26 10:14:47', '2022-10-26 10:14:49', '1760192781263546536');

我们要查询teach_id = '1760192781263546578' 的数据;

一般查询我们会:

select * from test_person;

如果我们要查询  teach_id= 1760192781263546578的数据,只需要加上where 即可:

select * from test_person where teach_id = '1760192781263546578';select * from test_person where teach_id = 1760192781263546578;

那么大家猜想一下,上面的这两个查询的结果是不是一样的呢?

结果: 不一样!!!    实际运行结果如下:

select * from test_person where teach_id = '1760192781263546578';

select * from test_person where teach_id = 1760192781263546578;

其中,入参 1760192781263546578 是 String 类型的值时,查询结果为我们期望的查询;入参为long类型的值时,查询结果非我们期望的数值。

在入参为long型但数据库中字段值类型未varchar类型的这种情况下,存在潜在的问题可能导致查询结果不符合预期,具体可能有:

  1. 数据类型不匹配: teach_id 字段是 varchar 类型,意味着它存储的是字符串数据。而您的查询条件直接提供了一个 long 类型的数值。虽然在某些编程语言或数据库接口中,数值可能会被隐式转换成字符串以便执行查询,但这种转换可能并非总是发生或按照预期方式进行。

  2. 隐式类型转换规则: 当比较不同数据类型的值时,MySQL遵循特定的隐式类型转换规则。在本例中,由于 teach_id 是字符串,而提供的值是数值,MySQL通常会尝试将数值转换成字符串进行比较。转换规则通常是将数值添加引号,形成一个字面字符串。例如,1760192781263546578 可能会被转换为 '1760192781263546578'

  3. 字符串比较逻辑: 即使数值被正确地转换成了对应的字符串形式,接下来进行的是字符串比较而非数值比较。这意味着,只要 teach_id 中的字符串以 '1760192781263546578' 开头,就会被认为匹配。例如,teach_id 值为 '1760192781263546578abc' 或 '1760192781263546578000' 等都会被查询语句视为匹配项,从而可能导致查询结果包含意外的行。

  4. 性能影响: 如果数据库中没有针对 teach_id 列建立合适的索引(如唯一索引或普通索引),或者由于类型不匹配导致索引无法有效利用,那么这种查询可能无法利用索引来加速检索,从而导致全表扫描,降低查询效率。即使有索引可用,由于数据类型不匹配造成的隐式类型转换也可能阻止MySQL完全利用索引优化查询。

所以使用 long 型数值直接查询 varchar 类型的 teach_id 字段可能会导致以下问题:

  • 查询结果包含非预期的数据,即那些 teach_id 以指定数值开头的行。
  • 查询性能下降,特别是当表较大且未对 teach_id 列创建合适索引时。

要解决这个问题,确保查询的准确性和性能,建议采取以下措施:

  • 类型匹配:在编写查询时,确保查询条件的类型与列的类型一致。对于本例,应该将 long 型数值转换为等效的字符串形式再进行查询:

    1SELECT * FROM user WHERE teach_id = '1760192781263546578';
  • 数据模型审查

    • 检查 teach_id 字段的设计是否合理。如果它实际上存储的是数值型数据,考虑将其数据类型改为更合适的数值类型(如 bigint),以保持数据一致性并避免不必要的类型转换。
    • 确保为 teach_id 创建适当的索引,特别是如果它是用于频繁查询和连接操作的关键字段。

通过以上调整,可以确保SQL查询能够准确地找到目标数据,并尽可能提高查询效率。

写在最后:另外希望大家在写代码的时候,能够注意一下数据库中的字段值和代码中的字段值类型要做到匹配,否则,那就是稳稳的BUG引入人了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS-33-jQuery02-选择器

一、单个选择器 选择器是jQuery的核心。 一个选择器写出来类似$(#dom-id)。 美元符号定义 jQuery 为什么jQuery要发明选择器?回顾一下DOM操作中我们经常使用的代码: // 按ID查找: var a document.getElementById(dom-id);// 按tag查找&am…

开发了一个在线客服系统

开发了一个在线客服系统 作为一名热爱编程的开发者,我最近完成了一个令人兴奋的项目——一个在线客服系统。这个系统是我使用Golang、MySQL、Vue2和ElementUI技术栈精心打造的结果。 技术栈选择 Golang:我选择Golang作为后端开发语言,因为…

Java的maven项目导入本地jar包的三种方式

文章目录 Java的maven项目导入本地jar包的三种方式1、在项目中创建一个lib文件夹,将想要使用的本地jar包放进去2、方法一:直接在pom.xml中添加下列依赖(项目协作推荐)3、方法二:在项目结构中引用lib文件夹(…

ATA-2048高压放大器在铁电材料中有什么应用

铁电材料是一类具有特殊电学性质的材料,它们能够在外加电场的作用下产生可逆的电极化,这种电极化可以在没有外加电场时保持。这使得铁电材料在许多应用中具有重要价值,特别是在电子设备和传感器领域。高压放大器作为一种电子设备,…

C++:Hash应用【位图与布隆过滤器】

什么是位图? 我们先来看一个问题: 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。【腾讯】 如果我们使用unordered_set容器来解决,40亿个数据,每个数据…

MaxCompute 近实时增全量处理一体化新架构和使用场景介绍

随着当前数据处理业务场景日趋复杂,对于大数据处理平台基础架构的能力要求也越来越高,既要求数据湖的大存储能力,也要求具备海量数据高效批处理能力,同时还可能对延时敏感的近实时链路有强需求,本文主要介基于 MaxComp…

python将pdf转为docx

如何使用python实现将pdf文件转为docx文件 1.首先要安装pdf2docx库 pip install pdf2docx2.实现转换 from pdf2docx import Converterdef convert_pdf_to_docx(input_pdf, output_docx):# 创建一个PDF转换器对象pdf_converter Converter(input_pdf)# 将PDF转换为docx文件pdf…

护眼台灯哪个牌子好?护眼灯十大品牌推荐,谁用谁真香

对于有子女的家庭,特别是那些热爱阅读的,晚上看书时更应该注重光线的问题,不然一旦光线过暗就容易导致视觉疲劳,进而演化为近视。因此,除了打开房间的灯,在桌面上放置一台护眼台灯更加能够保护眼睛。然而&a…

社交网络与Web3:数字社交的下一阶段

随着信息技术的飞速发展,人们的社交方式也发生了巨大的变化。从最初的互联网聊天室到如今的社交网络平台,我们已经见证了数字社交的不断演变和发展。而随着区块链技术的兴起,Web3时代的到来将为数字社交带来全新的可能性和挑战。本文将探讨社…

ADAPTIVE GRAPH DIFFUSION NETWORKS(自适应图扩散网络) 笔记

1 Title ADAPTIVE GRAPH DIFFUSION NETWORKS(Chuxiong Sun, Jie Hu, Hongming Gu, Jinpeng Chen, Mingchuan Yang)【2022】 2 Conclusion This study proposes the Adaptive Graph Diffusion Networks (AGDNs) which perform multi-layer generalized g…

MongoDB【五】索引

在MongoDB中,索引对于提升查询性能至关重要,特别是针对大型数据集时。以下是如何在MongoDB中创建、查看和删除索引的基本操作,以及不同类型的索引如何影响查询性能。 创建索引 1. 创建单字段索引: 升序索引(默认&am…

【JAVA基础篇教学】第十四篇:Java中设计模式

博主打算从0-1讲解下java基础教学,今天教学第十四篇:Java中设计模式。 设计模式是解决软件设计中常见问题的可重复利用的解决方案。在 Java 中,常见的设计模式包括单例模式、工厂模式、观察者模式等。目前在基础教学篇中只展示常见的几种模…

<Halcon> 可视化窗口调用

可视化窗口调用 C#代码 if (HDevWindowStack.IsOpen()) {var hwindow HDevWindowStack.GetActive();if (hwindow null) return;HOperatorSet.SetColor(hwindow, "red");HOperatorSet.SetDraw(hwindow, "margin");HOperatorSet.DispObj(object, hwindo…

kamailio 虚变量

伪变量是以$开头的一些变量,这些变量可以作为参数提供给不同的脚本函数,并且在执行函数之前,它们将被替换为一个值. 伪变量的开头用字符$标记。如果你想让字符$加倍$$。 有一组预定义的伪变量,其名称由一个或多个字符组成&#…

【WordPress】在 Ubuntu 系统上使用 Caddy 服务器来发布 WordPress 网站

在 Ubuntu 系统上使用 Caddy 服务器来发布 WordPress 网站可以通过以下步骤完成: 安装 Caddy 服务器: 首先,你需要在 Ubuntu 上安装 Caddy 服务器。你可以从 Caddy 的官方网站或者仓库获取安装包,也可以使用以下命令进行安装&…

STM32笔记---CAN采样点设置和报错

STM32笔记---CAN采样点设置和报错 采样点设置再同步补偿宽度(SJW)设置 报错分析CAN中断使能寄存器CAN错误状态寄存器 采样点设置 以前配置CAN参数的BS1和BS2参数时认为总线波特率符合要求就可以了,其实同一个波特率可能对应多组参数设置的情…

开发公司 or 个人开发者?软件开发如何选择?

引言 随着科技的发展,软件开发已成为一个相对复杂的行业,需要专业的技能和经验来保证项目的成功。许多企业、组织和个人都纷纷加入到了软件开发的队伍中。在选择软件开发人员时,您可能会面临一个选择:是找个人开发人员还是找专业的…

访问者模式【行为模式C++】

1.概述 访问者模式是一种行为设计模式, 它能将算法与其所作用的对象隔离开来。 访问者模式主要解决的是数据与算法的耦合问题,尤其是在数据结构比较稳定,而算法多变的情况下。为了不污染数据本身,访问者会将多种算法独立归档&…

数据结构与算法——22.哈希算法

这篇文章我们来讲一下哈希表中较为关键的部分——哈希算法 目录 1.哈希算法的介绍 2.hash算法的使用 2.1 Object.hashCode 2.2 String.hashCode 3.关于哈希表及哈希算法的一些思考 1.哈希算法的介绍 问题:什么是哈希算法?哈希算法有哪些&#xff…

一个专注于前端视觉效果的集合应用,包含CSS动效、Canvas动画、Three.js3D、人工智能应用等上百个案例

一个专注于前端视觉效果的集合应用,包含CSS动效、Canvas动画、Three.js3D、人工智能应用等上百个案例 文章目录 一个专注于前端视觉效果的集合应用,包含CSS动效、Canvas动画、Three.js3D、人工智能应用等上百个案例一、视觉设计二、交互设计三、Canvas动…