欢迎关注微信公众号:互联网全栈架构
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语句,貌似也不是很好的办法,你有什么好主意吗?欢迎私信讨论。
创作不易,烦请点个在看、点个赞,感谢!
推荐阅读: