MySQL查询时的字符串空格问题

因为官方文档上说是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   ";



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值