📄 一句话概括
字符串三兄弟:CHAR(n) 定长(不够补空格)、VARCHAR(n) 变长(多长存多长)、TEXT 大文本(不限长度)——日常选 VARCHAR,定长编码、国家代码选 CHAR,文章正文选 TEXT。
📝 本节和前面几节的关系
上一节管数字,本节管文字。第三章 students.name VARCHAR(20) 里的 VARCHAR(20) 到本节彻底讲清:括号里的 20 是什么、和 CHAR(20) 差在哪、什么时候升级用 TEXT。
一、CHAR:定长,不够就补空格
CHAR(10) 表示永远占 10 个字符:存 abc 也会在背后补 7 个空格凑满 10(读出来时多数数据库会去掉尾空格)。
适合:长度几乎固定的值——手机号(11)、国家代码(2)、MD5 之类的定长编码。每个格子都一样大,检索规整。
二、VARCHAR:变长,按实际长度存
VARCHAR(20) 表示最长 20,实际多长存多长:存 abc 就只占 3。
适合:长度不定的绝大多数场景——姓名、地址、书名。它是一般业务表的默认选择。
| 对比 | CHAR(10) | VARCHAR(10) |
|---|---|---|
存 abc 占用 |
10(补空格) | 3 |
| 超长处理 | 报错/截断 | 报错/截断 |
| 适用 | 定长 | 一般场景 |
三、TEXT:大文本,不限长度
TEXT 用来放长文章、JSON 字符串这类可能很长的内容。注意点:
- 不能设默认值(MySQL)
- 很大的 TEXT 会影响行读取性能,能 VARCHAR 就别 TEXT
四、动手 Demo:三者手感对比
CREATE TABLE str_test (
c CHAR(10),
v VARCHAR(10),
t TEXT
);
INSERT INTO str_test VALUES ('abc', 'abc', 'abc');
SELECT LENGTH(c) AS 定长字节, LENGTH(v) AS 变长字节 FROM str_test;
定长字节 变长字节
10 3
CHAR(10) 无论塞什么都是 10,VARCHAR(10) 按实际长度算。
五、30 秒实验
往 VARCHAR(10) 塞 11 个字符,观察报错信息——这就是 4-1 说的「类型拦截」在字符串上的体现。再把 11 个字符塞进 TEXT,畅通无阻。
六、常见误区
- 「CHAR 比VARCHAR 快,全用 CHAR」:定长检索确实规整,但短内容全被补空格浪费空间;性能差异对多数业务可忽略,选贴合数据本性的
- 「VARCHAR(20) 是 20 个汉字」:MySQL 4.1+ 按字符算(20 个汉字也行);老版本按字节算(UTF-8 下一个汉字 3 字节)——查清楚自己数据库的规矩
自测三问
1. CHAR(10) 存 abc 实际占多少?(10,补 7 个空格) 2. 姓名、地址用什么?(VARCHAR,变长贴合实际) 3. 什么用 CHAR?(手机号、国家代码等长度固定的值)- ☐ 下一节(4-4 DATE、DATETIME-处理日期和时间的数据类型)
相关笔记
- INT、DECIMAL、FLOAT、DOUBLE-处理数值的数据类型 —— 上一节:数值家族
- CREATE TABLE、DROP TABLE-创建和删除表 —— name VARCHAR(20) 的出处
- 🗄️ 数据库基础 · 索引 —— 全课路线图