MySQL字符串比较忽略尾随空格

server/2024/12/22 1:05:42/

问题

今天遇到一个线上问题,排查过程中发现,MySQL 查询条件使用字符串判断等时会自动忽略字符串尾部的空格,示例如下:

MySQL 表格结构:

mysql">CREATE TABLE `users` (`id` int(11) NOT NULL,`name` varchar(50) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

新增数据,注意 name 传的是 “AAA ”,尾部两个空格:

mysql">INSERT INTO `test1`.`users`(`id`, `name`, `age`) VALUES (1, 'AAA  ', 30);

当执行查询操作时,竟然查出了数据:

mysql">SELECT name, LENGTH(`name`) from users where name = 'AAA';

现象1

又试了当条件中空格在右时,可以匹配到数据:

现象2

当条件中空格在左时,又匹配不到数据:

现象3

原来,MySQL 在进行字符串比较时,默认情况下是对空格不敏感的,这与 MySQL 的 SQL 模式设置有关。

当使用=进行字符串比较时,如果字符串右侧包含空格,MySQL 会自动忽略这些空格。也就是说,在默认的 MySQL 配置下,'AAA''AAA ' 被认为是相等的。因此,在执行查询时:

SELECT name, LENGTH(`name`) FROM users WHERE name = 'AAA';

可以查到存储在数据库name = 'AAA ' 的数据。这是因为MySQL在比较时忽略了尾随空格。

为什么会这样?

MySQL 在进行字符串比较时遵循以下规则:

  1. 对于 CHAR 类型字段,存储时会自动删除尾随空格。
  2. 对于 VARCHAR 类型字段,在比较时会忽略尾随空格。

这种行为是因为 SQL 标准允许在字符串比较中忽略尾随空格。

如何避免这个问题?

如果你需要严格区分尾随空格,可以使用以下方法:

  1. 使用二进制比较:可以使用BINARY关键字进行严格比较。

    SELECT name, LENGTH(`name`) FROM users WHERE BINARY name = 'AAA';
    

    这样,MySQL会按照二进制字节逐个比较,尾随空格也不会被忽略。

    image-20240823182358502

  2. 使用LIKE进行精确匹配

    SELECT name, LENGTH(`name`) FROM users WHERE name LIKE 'AAA';
    

    LIKE运算符在处理尾随空格时也会更严格。

    image-20240823182430287

  3. 显式地处理空格:可以通过TRIM函数显式去掉空格后再进行比较:

    SELECT name, LENGTH(`name`) FROM users WHERE TRIM(name) = 'AAA';
    

image-20240823182507483

总结

MySQL默认在字符串比较中忽略尾随空格,如果需要进行严格匹配,可以使用BINARYLIKE或者显式处理空格的方法。


http://www.ppmy.cn/server/105318.html

相关文章

基于Spring Cloud的房产销售平台设计与实现

你好呀,我是计算机专业毕业生,很高兴与大家分享我的毕业设计。 开发语言:Java 数据库:MySQL 技术:Spring Cloud,前端使用HTML5、CSS3、JavaScript 工具:IDEA、Tomcat、MySQL 系统展示 首页…

从React服务器组件(RSC)反思Jakarta Faces技术

从React服务器组件(RSC)反思Jakarta Faces技术 2024.8.20版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1 引言 React 服务器组件(React Server Components,RSC)标志着 React …

微服务的基本理解和使用

目录​​​​​​​ 一、微服务基础知识 1、系统架构的演变 (1)单体应用架构 (2)垂直应用架构 (3)分布式SOA架构 (4)微服务架构 (5)SOA与微服务的关系…

在vs+QT中使用QT的库(multimedia.lib)

在链接器中添加外部库在链接器中添加附加依赖项目添加 #include <QtMultimedia/QMediaPlayer> // VS向.pro文件添加代码的方式 #pragma execution_character_set("utf-8") // qt支持显示中文 检查所用的配置和设定配置是否相同:

标准版v5.4安卓手机小程序扫码核销读取不到核销码的问题

修改这个文件&#xff0c;红色的那块代码替换成绿色的这段代码&#xff0c;然后重新打包上传。 文件地址&#xff1a;template/uni-app/pages/admin/order_cancellation/index.vue let path decodeURIComponent(res.path); self.verify_code path.split(‘code’)[1]; h5…

海绵城市雨水监测系统简介

海绵城市雨水监测系统主要有&#xff1a;数据采集、无线数据传输、后台云服务、终端平台显示等部分组成。系统通过前端数据采集水质&#xff08;ss\cod\浊度、PH等&#xff09;、雨水雨量、流量、水位、土壤湿度、气象等数据。通过无线数据传输通讯&#xff08;4G、5G、以太网、…

Docker微服务实战Demo

通过IDEA新建一个微服务模块通过dockerfile发布微服务部署到docker容器 通过IDEA新建一个微服务模块 新建一个spring boot项目modulemvn package打成一个jar包 通过dockerfile发布微服务部署到docker容器 编写dockerfile构建镜像运行容器访问测试 编写dockerfile ## 继承…

Vue路由

一.路由需求背景 当我们想要实现点击部门管理就展示部门管理的页面&#xff0c;点击员工管理就展示员工管理的页面这一效果时&#xff0c;我们就要使用Vue路由。前端路由就是URL中的hash值与组件之间的对应关系&#xff0c;因此要为不同的组件设定不同的hash值。 二.Vue路由…