因为官方文档上说是MySQL校对规则属于PADSPACE,对CHAR和VARCHAR值进行比较都忽略尾部空格,和服务器配置以及MySQL版本都没关系。也因此,如果遇到某些特殊的情况时,这是一个不容易的发现坑。会出现传入的查询值为“10 ”时,sql会将实际值为“10”的也查询出来。
假设有下面这么一张表:
CREATE TABLE `test` (
`name1` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`name2` char(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我们插入一行数据:
INSERT into test(name1,name2) values("10","10");
当我们运用下面的查询语句进行查询时,你会发现,记录居然都是可以查询得出来的。(明明我们插入的数据是只有10,但是我们查询时where的值是10加上N个空格)
SELECT
*
FROM
test
WHERE
name2 = "10 ";
SELECT
*
FROM
test
WHERE
name1 = "10 ";
而且,不管是varchar还是char类型,都是可以将结果查出来的。不过,需要特别注意的是,仅仅只有当空格出现在末尾的时候,才会发生这样的事情。也就是说,如果我们匹配的值是“ 10”,或者“1 0”这样的话,都是肯定查不出来的。
但是,这样还是不够啊,如果想做精细匹配怎么办呢?就是哪怕末尾多个空格都算它不正确,那要怎么弄呢?只需要改成下面的语句即可:
SELECT
*
FROM
test
WHERE
name1 = BINARY "10 ";