项目_MySQL比较字符大小的小坑

如果我们使用大字符串作为 MySQL 索引键会发生什么 正如我之前的文章里所解释的那样,B+树的深度决定了MySQL在仅考虑使用索引的情况下的最坏查询性能。在SSD的帮助下,拥有一个比4层更深的B+树应该是可以接受的。在这里,我有意设计了一张表,使用非常长的字符串作为主键和索引,这将导致非常深的B+树,最多达到9层,以测试在SSD上的最差性能,这在实际生产中是不太可能遇到的。 阅读详情

MySQL字符比较大小的小坑

0、前言

最近在帮学校做一个项目管理类的系统,我就大概说明一个哈,我们在t_project表中,存在一个varchar类型的project_state字段,用于记录目前该项目处于哪个阶段。比如说,用‘2’表示“审核中”,用‘3’表示“已审核”,用‘13’表示“已完结”。

然后现在,我们有一个需求是:列出所有“已审核”,但是“未完结”的项目,转化一个就是我们需要过滤出 ”3 <= project_state < 13” 的所有项目即可。

于是当时我们就写了一个SQL语句如下:

SELECT aaa,bbb,ccc 
FROM t_project 
WHERE xxx = xxx
AND t_project >= '3'
AND t_project < '13';

但是,当我们在调试时却发现结果并非我们想要的。当时刚觉逻辑也没问题呀,于是一直Debug调试,搞了一个多小时呀,最后发现就出在SQL语句上。

其实有些小伙伴已经发现了,就是字符 ‘3’其实是大于‘13’的。当时真的是恍然大悟,其实这个小知识点或者小细节我是知道的,当时开发的时候没注意,所以就在这篇博客记录一下,也算鞭策一下自己。


1、示例

我们先简单地创建一个表:

-- 创建一个表
CREATE TABLE t_project(
	INT project_id,
    VARCHAR project_state
);

接着我们再插入一些数据,如下图所示。

我们进行查询:

SELECT * 
FROM t_project 
WHERE project_state >= '3';

结果:

发现和我们想象的不太一样,按理来说,id为8、9、10的项目也应该被查询出来。

这是为何呢?

其实是因为,‘3’与‘13’在比较时,都是从左到右比较每个字符的,此处,‘3’已经是大于‘13’中的‘1’了,所以就直接返回‘3’ > ‘13’ ,即返回true。

其实,不止在MySQL的SQL中,在Java的字符串中都有这样一个问题。

例如,在Java中,我们输出这样一个语句:

public class Main {
    public static void main(String[] args) {
        System.out.println("3".compareTo("13"));
        System.out.println("13".compareTo("3"));
    }
}

/*
其输出结果为:
2
-2
*/

compareTo() 的返回值是int, 它是先比较对应字符的大小(ASCII码顺序)

  1. 如果字符串相等返回值0
  2. 如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ASCII码值)
  3. 如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方全比较完,这时就比较字符的长度。

再补充一点,在Java语法中,比较字符串相等不能使用“==”,要使用equals()方法。

string.equals("test");	
"test".equals(string);	//相较于第一种,更推荐第二种,可以有效防止“空指针异常”

2、问题解决

对于上述需求,我要查询 ”project_state >= 3” 的所有数据,我们这么书写SQL语句。

2.1、字符串+0

SELECT * 
FROM t_project 
WHERE t_project + 0 >= '3' + 0;
-- WHERE t_project + 0 >= 3; -- 这样也可以

结果:

2.2、CAST函数

SELECT * 
FROM t_project 
WHERE CAST(project_state AS SIGNED) >= 3;
-- 或者 WHERE CAST(project_state AS SIGNED) >= CAST('3' AS SIGNED)

结果相同,此处不贴图片了。

2.3、CONVERT()函数

SELECT * 
FROM t_project 
WHERE CONVERT(project_state AS SIGNED) >= 3;
-- 或者 WHERE CONVERT(project_state AS SIGNED) >= CONVERT('3' AS SIGNED)

结果相同,此处不贴图片了。

注意:如果使用MyBatis框架在XML文件中书写SQL语句,要注意“不等号”的方向,例如。

<select id="selectProject" resultMap="xxx">
    SELECT * 
	FROM t_project 
	WHERE CONVERT(project_state AS SIGNED) >= 3 
	AND CONVERT(project_state AS SIGNED) < 13;
</select>

其实这个SQL语句并没有什么毛病,只是在XML文件中,可以会将“<”当作是“标签的左括号”而报出“Tag name expected”,此时只需要改变括号方向即可。

<select id="selectProject" resultMap="xxx">
    SELECT * 
	FROM t_project 
	WHERE CONVERT(project_state AS SIGNED) >= 3 
	AND 13 > CONVERT(project_state AS SIGNED); <!--改变方向即可-->
</select> 

如有错误,敬请指正!

如何用Timer模型处理多变量时间序列?附完整代码示例 本文深入解析了如何运用清华大学的Timer模型处理多变量时间序列预测任务。通过一个完整的智能工厂设备监控实战案例,详细介绍了从数据预处理、模型构建、训练调优到预测可视化的全流程,并提供了可运行的完整代码示例,帮助开发者掌握这一强大的时序分析工具。 阅读详情

相关推荐

Howland电流源电路:从理论到实践的深度解析与优化策略

本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。

weixin_29243063的博客 441

mysql中三种比较字符串大小的方法

项目中发现一个bug SELECT points from table1 WHERE (JSON_EXTRACT(points,'$."27"')>="333") 筛选数据不准确,会晒出333以下的数据 问题就发生在比较的时候,进行的是字符串大小的比较, 直接进行字符串比较会发生数据不准确的问题,需要手动转型 1.通过在字符串后面加0实现比较 语法:ORDER BY ‘123’+0; 示例: SELECT '123'+0>127; -- 结果为0,表示false SELECT '123'+0

Koikoi12的博客 2万+

MT4-EA自动化交易研究笔记(2022-04-22)

自从接触到mt4的EA自动化交易,更让我这个10多年的老程序员看到了曙光,目前来看也确实出了一点成果,只是是否能稳定盈利有待时间的考验,所以开此专栏,一来做做记录与分析,更好的优化我的EA,二来也希望能与更多的高手交流,以完善我的交易系统

t35254056的博客 2290

mysql将字符串字段转为数字排序或比大小

mysql里面有个坑就是,有时按照某个字段的大小排序(或是比大小)发现排序有点错乱。后来才发现,是我们想当然地把对字符串字段当成数字并按照其大小排序(或是比大小),结果肯定不会是你想要的结果。 这时候需要把字符串转成数字再排序。 最简单的办法就是在字段后面加上+0 如把'123'转成数字123(以下例子全为亲测): 排序: 例: 方法一:ORDER BY '123'+0;(首推)

透明大脑 3万+

AWS入门实践-如何在AWS云上创建一个内外网隔离的生产环境

在 AWS 上建立一个内外网分离的生产环境,可以减少应用服务的暴露面,有效的保证你的应用服务器的安全。通常我们会将web应用放在外网的子网内,数据库服务器等放在内网的子网。我们将按照下图来部署动手实践环境,实现在public subnet的EC2虚拟机可以直接通过互联网可以访问,在Private subnet的EC2虚拟机不能通过互联网直接访问,但是却可以在内部来访问互联网安装应用等等。

weixin_39108752的博客 2993

关于StartAI本地部署相关问题解答

很多小伙伴们都有接入自己本地SD的需求,对此小编整理了一些相关问题~

HDJ9387的博客 940

MySql数值型字符串比较大小的坑

1.我们在做字符串数值比较大小的时候,通常会认为10比9大,但事实10却是最小的,怎么去解决这个问题,给出这样一个方案 2.现象 SELECT id, type_name AS typeName, type_code AS typeCode, pcode, tag_pic AS tagPic, is_del AS isDel FROM o2o_merchant_type O...

LuckFairyLuckBaby的博客 7822

【人工智能】在 cc-switch 中配置 AnyRouter 接入 Claude Code 完整指南

本文介绍了在cc-switch工具中配置AnyRouter中转服务以接入Claude Code的详细步骤。主要内容包括:1) 准备API令牌和端点地址;2) 填写基础信息和模型参数;3) 保存配置并重启终端生效;4) 常见问题排查方法。重点强调了API地址格式、模型ID准确性以及配置写入的必要性,帮助用户顺利完成中转服务配置,实现Claude 4.5版本的正常使用。

奶爸的编程之路,也就一周冷个三天 3102

MySQL中字符串比较大小(日期字符串比较问题)

MySQL中字符串比较大小(日期字符串比较问题) 数据库中在对于数字与非数字混合的字符串,在进行大小比较的时候,如果两字符串长度相等,那么两字符串就会比较相同位置的字符,比较时若字符是数字,则直接比较,若字符是非数字那么会转换为ascii码进行比较,若在某位置上已经有大小之分,那么就不会再进行比较。 如上所述,当字符串用于比较时间格式数据进行时间维度的比较时会出现问题。如以下sql进行查询时 select * FROM work_day_content as wdc WHERE wdc.work_da

yan_pan的博客 1万+

openHarmony之AI Engine:万字讲解如何在应用、开发板上接入AI大模型调用

本文章介绍如何在 OpenHarmony 开发板上集成和部署各类 AI 大模型,实现终端直接聊天功能,并为语音助手、智能机器人等应用提供 AI 接口支持。

m0_67505153的博客 619

YOLOv8融合HAttention:激活更多像素的注意力机制科研实践指南

HAttention通过层级化像素激活与融合的设计,为YOLOv8的像素级特征利用能力带来了质的飞跃。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决像素信息遗漏难题”的具体实践。如果你在实验中发现某类细节或大尺度目标的检测仍有不足,可以尝试结合数据增强(如随机裁剪、多尺度训练)来强化模型对像素特征的学习能力。科研的价值在于不断挖掘技术的潜力,希望这份指南能真正帮你在目标检测的像素级特征利用领域找到新的突破点,祝你在科研探索中持续收获创新与成长。

FJN110的博客 105

MySQL数据库中varchar类型的数字比较大小

创建测试表 测试SQL -- 找出current_price比price小的记录 select * from check_test where current_price<price; select * from check_test where (current_price+0)<(price+0); -- 找出current_price比price大的记录 select * from check_test where current_price>price; s..

二木成林 1万+

BoT-SORT实战:手把手教你实现BoT-SORT训练和测试

文章目录摘要1、数据准备2、配置BoT-SORT环境2.1、获取代码2.2、创建虚拟环境2.3、安装必要的包2.3.1、安装pytorch2.3.2、安装cython2.3.3、安装Cython-bbox2.3.4、安装faiss2.3.5、安装其他的包3、训练3.1、生成REID数据集3.2、预训练模型3.2.1、ByteTrack预训练模型3.2.2、REID预训练模型3.3、开始训练4、如何更改FASTREID的BackBone?5、测试5.1、测试视频5.2、测试摄像头5.3、多类别测试 摘要 Bo

m0_47867638的博客 2297

【mysql知识点整理】--- int(N),char(N)、varchar(N),decimal(M,N)中的N、M是什么意思???

文章目录1 int(N)中N的含义2 验证2.1 验证1 ---> 大于N长度的数字可以正常插入到数据库2.2 验证2 ---> N只是表示显示宽度2.2.1 使用zerofill关键字进行验证2.2.2 使用zerofill关键字时需要注意的一个小坑 1 int(N)中N的含义 注意: N只是显示宽度, 不表示存储数字长度的上限。 2 验证 2.1 验证1 —> 大...

nrsc 2987

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

mysql中字符串与数字比较大小_MySQL中字符串和数字的比较(附示例)

本篇文章给大家带来的内容是关于MySQL中字符串和数字的比较(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。在项目中,我们经常会用到模糊搜索,但如果错误的将字符串类型和数字类型做比较,有时搜索出来的结果就并不是我们预期的。举例如下:mybatis中的xml语句如下:AND (name like concat("%",#{criteria},"%") OR id = #{c...

weixin_36478866的博客 4309

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

mysql中字符串与数字比较大小_如何比较两个字符串在MySQL中是数字?

要比较MySQL中的两个数字字符串,请使用CAST()函数。语法如下select*fromyourTableNamewherecast(yourColumnNameassigned)=yourIntegerValue;为了理解上述语法,让我们创建一个表。创建表的查询如下createtablecompareTwoStringDemo->(->UserIdvarchar...

weixin_39694264的博客 1254

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

mysql 字符串里面的数字,按照大小排序

转自:http://www.cnblogs.com/codefly-sun/p/5898738.html mysql数值字符串类型的按照数值进行排序 今天遇到一个问题,就是对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动的识别出这些数据是数值,百

你好邱林和的专栏 2万+

关于MySQL中数字和字符串比较的问题

在写一个Python语句时,需要把在MySQL中存为char(10)的时间戳和新获取的时间戳作对比。 新获取的时间戳,使用time.time()得到,故格式定为浮点型; 数据库中的时间戳,保存类型为字符串,经过fetchone方法获取后也确实为str类型。 这二者在Python中直接比较,当然会报错,但在MySQL中,则神奇地可以比较,并且比较结果是准确的。 查询官方文档得知,MySQL中二者比较时,字符串会自动截取前面数字部分来比,所以’123abc’>99。 而如果两个字符串比较,则从第一位开始比

sinat_38371226的博客 1049

mysql使用max函数判断字符串大小,比较大小的规则是什么?

例如,字符串 "apple" 将小于字符串 "banana",因为 "a" 的 ASCII 值小于 "b"。字符串 "apple" 也将小于 "apples",因为 "apple" 较短,并且两个字符串在 "apple" 部分是相同的。函数来比较字符串时,比较的规则是基于字符串的字典顺序(lexicographical order),也就是按照 ASCII 值来比较字符串中每个字符的大小。如果需要确保比较是区分大小写的,请使用区分大小写的校对规则(如。如果你的列使用的是不区分大小写的校对规则(如。

少说,多做。 5520

在MySQL中字符串和整数比较的行为

在MySQL中,当进行字符串和整数的比较时,MySQL会尝试将字符串转换为数值来进行比较。这种转换遵循特定的规则: 如果字符串的开头部分包含数字,那么MySQL会将这个数字部分提取出来,并将其用作比较的数值。 如果字符串以非数字字符开头,则在比较时该字符串会被转换为数值0。

龙大的博客 1146

【mysql之字符串进行运算或大小比较】

mysql之字符串进行运算或大小比较 - 简书

u012632105的博客 807

MySQL中字符串与数字比较的坑之二

上一篇文章是转载的,主要说了MySQL字符串转数值的一些坑,然而,并没有解决我遇到的问题,试了几个小时终于发现了些端倪,简单记录一下。 我在排查问题的时候,用Navicat查询数据库,本该是字符串的地方我写成了数值,结果诡异的情况发生了: 按照上一篇文章的说法,字符串转数值会截取第一个非数字前面的数字,按照这个说法,这个数值应该是2892000120000020275才对,那么应该只有

thekenofDIS的专栏 6465

mysql 数字类型的string 类型的如何比较大小

字符串相关学习资料:https://edu.51cto.com/video/3832.htmlhttps://edu.51cto.com/video/4055.html在数据库中,比较数字类型和字符串类型的大小是一个常见的需求。在MySQL中,我们可以通过一些技巧来实现这个需求。本文将通过一个具体的例子来说明如何在My...

weixin_36612041的博客 382

mysql 字符串和数字类型比较的坑

mysql 字符串和数字类型比较会把字符串依次和数字进行比较,直到第一个非数字的字符,如果过长,还会截取,巨坑无比,一定要慎重。 总结:容易令人以为不会做的事千万不要做,做了也要标题加粗标红提示出来这儿有巨坑 ...

buyulian的博客 1626

Mysql 13位时间戳 时间对比查询

业务需求:查询大于(小于)现在时间的数据出来… 本人数据库录入的是时间戳…比如说这家伙:1544948140000,这个是13位的时间戳 mysql的时间对比,是日期…比如:2018-12-16 16:15:40 然后重点来了…怎么对比捏…我想法是把时间戳转成日期然后再进行对比…emmm… 用到的mysql函数: 1.ROUND() : 四舍五入 2.FROM_UNIXTIME() 将时间戳格式化...

兄弟我先抛块砖,有玉的尽管砸过来 3114

mysql比较两个数函数_mysql函数之比较函数(2)

1、比较操作符:= 、 >、>=、 <=、<>、 != 、<=>这里面就是知道下 <> 和 !=意义是一样的都是不等于的意思,看个人的喜好<=>是用于当比较的两边的值存在是空(NULL)的情况,这种情况有的时候会遇到,mysql提供这种方式的比较符,类似于"=",不同的是当两边要比较的数都为NULL的话它返回true(表示两边相等...

weixin_42504214的博客 3781
上一篇: 基于Spring Boot的简易版新闻管理系统
下一篇: 信息可视化大屏展板(附下载连接)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值