浅谈char与varchar尾随空格对比

后端1 min
#Mysql
目录(5)

背景

在日常业务中,偶然发现前端传入的串是有尾随空格的,但是实际使用中并未出问题。 例如执行查询:

SELECT * FROM a WHERE str = "你好";

但是可以匹配到:

str = `你好 `; 
str = `你好`; 

实验

环境

Mysql 5.7.27

未调整空格处理模式 (MySQL :: MySQL 8.0 Reference Manual :: 10.8.5 The binary Collation Compared to _bin Collations)

CREATE TABLE vc (v VARCHAR(4), c CHAR(4));

INSERT INTO vc VALUES ('ab  ', 'ab  ');

SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc;
-- CONCAT('(', v, ')') | CONCAT('(', c, ')')
-- (ab  )  						 |	(ab)

SELECT * FROM vc WHERE v = 'ab';
-- v   | c
-- ab  | ab

SELECT * FROM vc WHERE c = 'ab';
-- v   | c
-- ab  | ab


SELECT * FROM vc WHERE v LIKE 'ab';
-- v   | c
--     |

SELECT * FROM c WHERE v LIKE 'ab';
-- v   | c
-- ab  | ab

结论

  • 插入带尾部空格的字符串
    • char,截取尾随空格
    • varchar,不做处理
  • 查询对比时
    • 等号,过滤等号右侧的尾随空格
    • LIKE,不做处理

相关文档

MySQL :: MySQL 8.0 Reference Manual :: 11.3.2 The CHAR and VARCHAR Types