🗄️ 第四章 管理数据-避免非法数据的功能
📄 一句话概括

字符串三兄弟: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 字符串这类可能很长的内容。注意点:

四、动手 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,畅通无阻。

六、常见误区

自测三问 1. CHAR(10) 存 abc 实际占多少?(10,补 7 个空格) 2. 姓名、地址用什么?(VARCHAR,变长贴合实际) 3. 什么用 CHAR?(手机号、国家代码等长度固定的值)

相关笔记