mysql中between……and……的范围,对“应用在字符上左闭右开”的正确解释,纠正老杜的说法

本文探讨了MySQL中BETWEEN操作符在字符数据类型上的使用,指出了一种常见的误解,即认为在字符上BETWEEN是左闭右开的。通过实验验证,得出BETWEEN实际上是闭区间的结论,无论对数字还是字符。同时,解释了MySQL中字符串比较基于ASCII码的规则,强调在比较时应考虑字符顺序和全匹配。
摘要由CSDN通过智能技术生成

起因

因为技术的细节有很多,我习惯做笔记,特别是一些新奇的、在我认知之外的,我更喜欢记录一下。今天我在复习mysql时,看我之前的笔记,看到了这么一条笔记
笔记

对于我自己记的东西,很多时候我都是深信不疑,因为我肯定是经过验证或者很肯定的事情,我才记的。但是翻笔记的时候离我做笔记的时候已经过了好久了,所以我不是很肯定这条笔记的正确性。于是我百度了一下,惊奇的发现,百度上全都是这么一个结论:between是闭区间,压根没有提“应用在字符上是左闭右开”的事情,我当时就觉得很怪异,因为如果真的有这条结论的话,网上应该有相关的文章才对。

验证

既然网上没有结论,那我自己进行验证。
测试表:
测试表测试数据:
测试数据

测试SQL
测试SQL

三条SQL全都把所有的数据都查询出来了,那么我的笔记“between……and应用在字符上是左闭右开”就不对了,那为什么我会记这条记录呢?

溯源

我依稀记得是我在b站看老杜的mysql视频的时候记的这条笔记,老杜mysql 视频连接:https://www.bilibili.com/video/BV1fx411X7BD。
翻了两下目录,找到了我记这条笔记的原因,的确是老杜说的,在这一集 https://www.bilibili.com/video/BV1fx411X7BD?p=14 的2分钟处,老杜推导出来这么一个结论,因为这个结论当时是老杜在视频中推导出来的,所以我自己就没有验证,直接记录的,但是我上面在验证的时候,发现结论并不是老杜推导的那样。

当时看的时候没有想到,现在看来,其实老杜的推导不严谨,所以得出的结论不正确,建议读者看一下这个视频https://www.bilibili.com/video/BV1fx411X7BD?p=14,很短,总共就5分钟,开个两倍就两分钟。看了之后更能理清事情的来龙去脉,我为什么要记“between……and……应用在数字上的时候,是闭区间。应用在字符上时,是左闭右开”这条笔记,以及接下来的复盘。

复盘

老杜的推导不正确,为什么说不正确呢?我简单的模拟一下当时老杜数据库里的数据,还是上面的那张表,多加了几条数据,如下
新加数据
当时老杜的第一条测试SQL是这样的
第一条测试SQL
查出来的数据是这样的
老杜第一条测试SQL结果
咋一看,好像是左闭右开的,因为name为CD的那条记录没有被查出来

老杜为了严谨,然后又测试了一条SQL
老杜测试的第二条SQL
查询结果是这样
老杜第二条测试SQL结果
name为DE的那条记录没有被查询出来,好像也验证了左闭右开,但实际上真的是这样吗?
什么为闭?能取到边界值,即为闭,但是第一条测试的右边界是“C”并不是“CD”,第二条测试的右边界是“D”,不是“DE”,这怎么能验证呢?

那我们来试试右边界为CD和DE的时候是怎么样的,
正确的边界
果然,右边界为CD时能查询到name为CD的那条记录,右边界为DE时能查询到name为DE的那条记录。

那这么一说,是包含边界值,但是也不对啊,左边界是A,为何能查询到name为AB的记录呢?

真相

左右边界都为一个单字符,为啥左边的就能取到,右边的就不能取到呢?相信有的小伙伴已经大概猜到了,因为左边界一个单字符A是小于AB的,所以能查到AB,而右边界的C也是小于CD,所以CD不在AC范围内,查询不到。

其实字符串在比较是是按照ASCII码进行比较的(包括大于、小于、等于和between……and……),在mysql中是这样的,从左边第一个字符开始比,相同则比较下一个字符,如果其中一个字符串没有下一个字符,则另一个大。可以用一些特殊符号结合其ASCII值用大小于来进行测试,
测试mysql中的字符串比较

所以,AB比A大,CD比C大,所以A~C能查询到AB,并不能查询到CD。

所以最终结论是:

  1. between……and……是闭区间,两边界都能取到,无论是应用在数字还是字符上,
  2. MySQL中字符串比较是从左到右按位按照其ASCII值来进行比较的
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值