离大谱,MySQL竟然无视空格的存在!

欢迎关注微信公众号:互联网全栈架构

MySQL是非常受欢迎的一款关系型数据库,使用者非常多,按理说,如此流行的产品应该非常严谨才对,但有一个小细节有点超乎我的理解:就是它会直接忽略尾部的空格,我们来看看实例演示:

先创建一个简单的表并插入数据:

CREATE TABLE `t_test_space` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `first_name` varchar(30) DEFAULT NULL COMMENT '名',
  `last_name` varchar(30) DEFAULT NULL COMMENT '姓',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `t_test_space` VALUES ('1', 'Mic', 'John');
INSERT INTO `t_test_space` VALUES ('2', 'Hy', 'Jack ');

这个表结构和数据都没什么好说的,很简单,不过需要注意一点的是,对于id=2的记录,它的last_name为Jack ,最后有个空格,稍微留意一下。

接下来我们写一个SQL,查找last_name等于John的记录,不过查询参数加了一个尾部空格,像下面这样:

SELECT * FROM t_test_space WHERE last_name='John '

表里面的数据是没有空格的,按道理,上面这个SQL应该查询不出结果才对,毕竟,空格也是一个正经的字符,然而,执行上面的SQL,竟然返回了数据:

41343414f90e2b85cb491e95464f48b4.png

而且,不管后面加多少个空格,貌似都不影响,还是会返回结果,比如下面这个SQL也会查询出last_name等于John的数据:

SELECT * FROM t_test_space WHERE last_name='John                  '

真是离了大谱,明明不相等,还会返回结果!

不光是参数有这个问题,如果数据库里的数据有尾部空格,查询的时候依然被无视了,比如上面提到的id=2的记录,它的last_name为Jack ,最后有一个空格,如果我们写一个SQL,查询姓氏为Jack的数据:

SELECT * FROM t_test_space WHERE last_name='Jack'

参数没有传入空格,但它仍然会返回结果:

53f361009ac9660a16e24365ddd4b21d.png

测试下来,貌似MySQL完全忽略了尾部的空格,不管是数据库中的记录,还是传入的参数,都自动忽略了尾部空格,真是有点反常识,堂堂正正的一个字符,就这样被无视了。

当然,在MySQL中,如果需要解决这个问题,不管有没有尾部空格都要严格进行匹配,那我们可以使用关键字BINARY,像下面这样:

SELECT * FROM t_test_space WHERE BINARY last_name='Jack '

这样就会严格匹配了,上面的SQL参数最后有一个尾部空格,跟数据库中的数据完全一样,它返回了一条记录。如果参数去掉了尾部空格,则不会返回结果。

但BINARY是MySQL独有的关键字,如果使用了ORM,包括公司自研的ORM,那么就得针对MySQL数据库额外编写的SQL语句,貌似也不是很好的办法,你有什么好主意吗?欢迎私信讨论。

创作不易,烦请点个在看、点个赞,感谢!

推荐阅读:

什么是SQL注入?基于实例讲解

吃透Redis系列:总体介绍

高频面试题:合并两个List并去重

彻底搞懂MySQL的执行计划

数据同步的利器:Canal

拒绝空谈:实例演示MySQL事务隔离级别

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值