IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL MAX()函数针对VARCHAR类型的问题 -> 正文阅读

[大数据]MySQL MAX()函数针对VARCHAR类型的问题

问题描述

我们的系统某一处业务逻辑需要查询某个表里面一个字段的最大值。sql不难,就是一两个join。 一直运行没有问题。 但是某一天,突然发现这个地方有点问题,没有查询出来想要的结果。 导致用户无法选择想要的任务。

问题排查

找过来之后,第一直觉是他的操作有问题,但是仔细确认之后,发现用户的操作并没有问题。数据本身是有的,但是并没有被查询出来。
于是就找到这段SQL,拿出来,去数据库查询一下。发现确实没有得到正确的结果。那么很明显问题就是出在这段SQL上。
但是发现这部分逻辑在开发环境上无法复现,察觉到不简单。
于是将SQL分段进行排查,使用其中的第一段查询的时候发现问题了,这部分SQL的查询结果其实已经出问题了。所以后面总的结果有问题就说得通了。

问题复现

错误情况

这里将SQL与数据库结构简化一下:

  • sql
select max(test2) as exec_id, test1 from test group by test1;
  • 数据:
    test1 : int test2: varchar
    mysql数据
    这段SQL的逻辑很简单,我们就是想要分组的情况下,找出每个test1的值对应的最大的test2的值

SQL执行结果:
在这里插入图片描述
很明显不正确。 这个时候大概知道了 可能是MAX这个函数引起的。 那么为什么会引起呢。 考虑到 test2字段的字段类型:varchar
大概猜到跟这个也有关系。

正常情况

将test2的字段类型改成int。这个时候再去执行SQL

SQL执行结果:
在这里插入图片描述

问题结论

那么就能看出来,是因为 MAX()函数作用在varchar这种字符类型列上的时候,比较逻辑并不是按照int类型的比较逻辑。
从MySQL官方文档的解释来看: MAX() may take a string argument; in such cases, it returns the maximum string value
当MAX函数作用在一个字符类型上的时候,会返回最大的字符值。

那么怎么修复这个问题呢,改字段不太可取 动的地方比较多。
那么就用改SQL的方式来实现好了

select max(test2+0) as exec_id, test1 from test group by test1;

这样的SQL就能够做到将test2作为 int来进行比较。 能够得出正确的值。

Final

记录一下,下次不要再这样用MAX函数了

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-23 10:53:19  更:2022-04-23 10:54:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:26:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码