Py学习  »  DATABASE

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

脚本之家 • 2 月前 • 107 次点击  
将 脚本之家 设为“星标
第一时间收到文章更新
图片

来源 | 互联网全栈架构

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,竟然返回了数据:

而且,不管后面加多少个空格,貌似都不影响,还是会返回结果,比如下面这个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'
参数没有传入空格,但它仍然会返回结果:

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

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

SELECT * FROM t_test_space WHERE BINARY last_name='Jack '

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

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

END

图片



    
  推荐阅读:
  1. 微软带回Win 11眼馋5年功能,反手骚操作被骂惨了
  2. 公司成了大龄程序员集中营了,最近招了很多40岁左右的开发,很便宜。工资之前都四五万,来到我们这只有两万出头,特别好用效率很高
  3. 为什么有些程序员接到 bug 反馈,第一反应是狡辩?
  4. 冯·诺依曼的传奇人生
  5. 拯救过无数个学生的文库网站们,正在倒下。。。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/193636