Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL的CHAR、VARCHAR、TEXT等字符串字段在等值比较("=")时,会忽略掉尾部的空格,导致有空格也能匹配上的坑

MySQL的CHAR、VARCHAR、TEXT等字符串字段在等值比较("=")时,会忽略掉尾部的空格,导致有空格也能匹配上的坑

作者头像
翎野君
发布于 2024-01-29 00:11:39
发布于 2024-01-29 00:11:39
44000
代码可运行
举报
文章被收录于专栏:翎野君翎野君
运行总次数:0
代码可运行

一、现象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `user_info` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键自增ID',
  `user_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '名字',
 
  PRIMARY KEY (`id`),
  KEY `idx_user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
 
INSERT INTO user_info(user_name) values('lingyejun'); #无空格
INSERT INTO user_info(user_name) values('lingyejun '); #一个空格
INSERT INTO user_info(user_name) values('lingyejun    '); #四个空格

如上有个user_info表,我们分别插入'lingyejun'、'lingyejun '、'lingyejun '三个用户。

但我们在查询时却遇到一个诡异的现象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM user_info WHERE user_name = 'lingyejun'; #无空格
SELECT * FROM user_info WHERE user_name = 'lingyejun '; #一个空格
SELECT * FROM user_info WHERE user_name = 'lingyejun  '; #两个空格
SELECT * FROM user_info WHERE user_name = 'lingyejun    '; #四个空格

无论查询中尾部带有几个空格,结果是一样的,都会命中'lingyejun'、'lingyejun '、'lingyejun '三个用户

二、原因

查询MySQL的官方文档(https://dev.mysql.com/doc/refman/5.7/en/char.html),原来MySQL的校对规则基于PAD SPACE,这就意味着CHAR、VARCHAR、TEXT等字符串的等值比较(“=”)会忽略掉尾部的空格

而且这也符合SQL标准,无需设置也无法改变(参考:https://stackoverflow.com/questions/10495692/mysql-comparison-operator-spaces

三、想要精确查询的解决方案

3.1 like

like不会忽略尾部的空格。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM user_info WHERE user_name LIKE 'lingyejun';
SELECT * FROM user_info WHERE user_name LIKE 'lingyejun '; #一个空格
SELECT * FROM user_info WHERE user_name LIKE 'lingyejun    '; #四个空格

3.2 binary

binary不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解成精确匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM user_info WHERE user_name = BINARY 'lingyejun';
SELECT * FROM user_info WHERE user_name = BINARY 'lingyejun '; #一个空格
SELECT * FROM user_info WHERE user_name = BINARY 'lingyejun    '; #四个空格

注:这里的BINARY关键字要放在“=”的后边,以便有效利用该字段的索引。

四、结论

  • MySQL的CHAR、VARCHAR、TEXT等字符串字段在等值比较("=")时,基于PAD SPACE校对规则,会忽略掉尾部的空格
  • 在存储时,不会自动截断尾部的空格,会按原值存储
  • 如果想要精确查询就不能用等值查询(“=”),而应改用like或binary

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://cloud.tencent.com/developer/article/2384297

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
需要注意的是,name字段值分别是:不带空格的duduu、带一个空格的duduu、带两个空格的duduu,且空格都是加在了尾部。我们查询这几条记录的name字段的长度:
翎野君
2023/05/12
9350
mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
varchar在字符集不同情况下导致的查询异常
对于那些删除了尾随字符或比较忽略了尾随字符的情况,如果列具有需要唯一值的索引,则在列中插入仅在尾随字符数量上不同的值将导致重复键错误。
保持热爱奔赴山海
2023/03/16
7710
OceanBase 字段扩容避坑:字符集变更导致 DDL 失败
程序报错提示长度超过列长,需要扩容字段长度。在执行修改的时候报错 ERROR 1235 (0A000): Alter charset or collation type not supported,提示不支持字符集或排序规则变更。
爱可生开源社区
2025/04/02
1610
OceanBase 字段扩容避坑:字符集变更导致 DDL 失败
MySQL 常用语句(值得收藏)
Windows服务 -- 启动MySQL net start mysql -- 创建Windows服务 sc create mysql binPath= mysqld_bin_path(注意:等号与值之间有空格) 连接与断开服务器 mysql -h 地址 -P 端口 -u 用户名 -p 密码 SHOW PROCESSLIST -- 显示哪些线程正在运行 SHOW VARIABLES -- 显示系统变量信息 数据库操作 -- 查看当前数据库 SELECT DATABASE(); --
办公魔盒
2019/07/22
1.7K0
MySQL 常用语句(值得收藏)
MySQL之表的数据类型
一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql常用数据类型概览 #1. 数字: 整型:tinyinit int bigint 小数: float :在位数比较短的
人生不如戏
2018/04/10
5.7K0
MySQL之表的数据类型
记一次字符串末尾空白丢失的排查 → MySQL 是会玩的!
  他说:明明表名的入参是 test  ,为什么展示到界面的记录包括 test 这条记录?
青石路
2023/10/16
2860
记一次字符串末尾空白丢失的排查 → MySQL 是会玩的!
干货!超过500行的Mysql学习笔记
本文介绍了软件测试的基本流程和常用的测试工具。软件测试的基本流程包括需求分析、设计、编程、测试、部署和维护。常用的测试工具有QTP、Selenium、JMeter、LoadRunner等。
企鹅号小编
2018/01/09
1.4K0
干货!超过500行的Mysql学习笔记
【转载】MySQL尾部空格处理与哪些设置有关?
之前有研发反馈,同一个SQL在测试环境和生产环境,数据一样,跑出来的结果却有差异。 经过排查后,发现2套环境的表字符集不一样。测试之前是5.6升级到8.0的,表字符集是utf8_general_ci的,而生产一直就是用的8.0,表字符集是utf8mb4_0900_ai_ci。
保持热爱奔赴山海
2023/07/31
6960
【转载】MySQL尾部空格处理与哪些设置有关?
MySQL中CHAR和VARCHAR类型学习--MySql语法
本文学习的是MySQL中CHAR和VARCHAR类型学习,CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
用户1289394
2021/07/30
1.4K0
MySQL基础数据类型
  存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
changxin7
2022/05/06
5.1K0
MySQL基础数据类型
【mysql】文本字符串类型
情况1:存储很短的信息。比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的,结果得不偿失。
兮动人
2022/03/12
2.1K0
MySQL字符比较,这也能行???
今天在线上遇到了一个MySQL字符比较的问题,感觉很有意思,专门研究了下,估计大家都没有遇到过,这里跟大家分享一下。
AsiaYe
2022/04/01
1.2K0
MySQL字符集乱码总结
查看数据库编码: show create database db_name; 查看表编码: show create table tbl_name; 查看字段编码: show full columns from tbl_name; show full fields from tbl_name;
阳光岛主
2019/02/19
9.5K0
【说站】mysql中有哪些字符串类型
1、char和varchar都用来保存MySQL中的短字符串。varchar列中的值是可变长字符串。
很酷的站长
2022/11/23
7770
【说站】mysql中有哪些字符串类型
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
上篇文章MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀我们讨论过时间类型的选择
菜菜的后端私房菜
2024/06/11
1K1
MySQL存储的字段是不区分大小写的,你知道吗?
之前写过一篇关于mysql 对表大小写敏感的问题(你有遇到过MySQL因大小写敏感导致的问题吗),其实在mysql中字段存储的内容是不区分大小写的,本篇进行简单的总结。
全栈程序员站长
2022/07/20
5.5K0
MySQL字段类型和字符集
5.存储空间利用高,仅存储实际字符数和少量长度信息,适用于存储长度差异较大的字符串数据
晚上不吃饭了
2025/05/06
3340
探秘 MySQL 数据类型的艺术:性能与存储的精妙平衡
在数据库设计中,选择合适的数据类型对性能、存储效率和数据完整性至关重要。MySQL 提供了丰富的数据类型,帮助开发者更灵活地处理不同的数据需求。然而,不同的数据类型各有优缺点,了解这些特性可以帮助我们更高效地设计和管理数据库。本篇文章将深入探讨 MySQL 的主要数据类型、使用场景和优化建议,帮助读者在开发过程中做出明智的选择。
suye
2025/05/29
1640
探秘 MySQL 数据类型的艺术:性能与存储的精妙平衡
表的数据类型
一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data-types.html http://dev.mysql.com/doc/refman/5.7/en/data-type-overview.html mysql数据类型概览 #1. 数字: 整型:tinyinit int bigint 小数: float :在位数比较短的情况
用户1214487
2018/01/23
4.6K0
表的数据类型
详解MySQL索引
索引是帮助MySQL高效获取数据的数据结构。在数据之外,数据库系统还维护着一个用来查找数据的数据结构,这些数据结构指向着特定的数据,可以实现高级的查找算法。
code随笔
2022/05/17
8030
详解MySQL索引
相关推荐
mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验