Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql char 和 varchar区别

mysql中 char 和 varchar 的区别解析

作者:rchmin

本文详细解释了MySQL中CHAR和VARCHAR两种字符串数据类型的区别,包括长度处理、存储方式、尾部空格处理和性能考量,并给出了选择建议,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

这是一个在 MySQL 面试和日常开发中非常经典的问题。CHAR 和 VARCHAR 是两种最常用的字符串数据类型,它们的核心区别在于存储和检索的方式

下面我将从多个维度详细解释它们的区别,并给出选择建议。

核心区别总结

特性CHARVARCHAR
长度处理固定长度可变长度
存储方式分配定义的全部空间,不足部分用空格填充只存储实际字符数(+1或+2字节存储长度信息)
存储空间固定,为声明的长度可变,为实际字符串长度 + 长度前缀
尾部空格检索时会自动删除检索时会保留
读取速度较快(固定长度,无需计算)稍慢(需要根据长度信息读取)
适用场景长度固定或近乎固定的数据(如MD5、UUID、状态码)长度变化较大的数据(如姓名、地址、描述)

详细解释

1. 存储方式与空间占用

2. 尾部空格的处理(关键行为差异)

这是另一个非常重要的区别,尤其是在进行字符串比较时。

CHAR:在检索(SELECT)时会自动移除存储时填充的尾部空格。

-- 假设有一个 CHAR(5) 的列
INSERT INTO table (char_column) VALUES ('abc '); -- 存储为 'abc  '
SELECT char_column, LENGTH(char_column) FROM table; 
-- 检索结果:'abc',长度为 3(尾部空格被移除)

VARCHAR:在检索时会保留尾部空格。

-- 假设有一个 VARCHAR(5) 的列
INSERT INTO table (varchar_column) VALUES ('abc  '); -- 存储 'abc  ' 及其长度信息
SELECT varchar_column, LENGTH(varchar_column) FROM table;
-- 检索结果:'abc  ',长度为 5(尾部空格被保留)

注意:由于 CHAR 的这种行为,当使用 = 比较时:

'abc '(CHAR)和 'abc'(CHAR)是相等的;

'abc '(CHAR)和 'abc'(VARCHAR)是相等的;

'abc '(VARCHAR)和 'abc'(VARCHAR)是不相等的。

3. 性能考量

如何选择?

请根据你的业务场景来决定:

一个简单的例子

CREATE TABLE test_string (
    id INT PRIMARY KEY,
    fixed_char CHAR(5),
    variable_varchar VARCHAR(5)
);
INSERT INTO test_string (id, fixed_char, variable_varchar) VALUES
(1, 'A', 'A'),       -- CHAR存储 'A    ', VARCHAR存储 'A'
(2, 'ABCDE', 'ABCDE'); -- 两者都存满
-- 查询并显示长度
SELECT 
    fixed_char, 
    LENGTH(fixed_char) as char_length,
    variable_varchar, 
    LENGTH(variable_varchar) as varchar_length
FROM test_string;

结果可能如下

fixed_charchar_lengthvariable_varcharvarchar_length
A1A1
ABCDE5ABCDE5

总结

在现代 MySQL 版本和 InnoDB 存储引擎下,对于大多数通用场景,VARCHAR 因其灵活性而更受欢迎。除非你非常确定某个字段的长度是绝对固定的,否则从 VARCHAR 开始通常是一个安全的选择。

到此这篇关于mysql中 char 和 varchar 的区别的文章就介绍到这了,更多相关mysql char 和 varchar区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文