📄 一句话概括
数据类型是数据库的第一道防线:建表时给每一列指定类型,之后所有数据想进这列,都必须先过「类型检查」这一关——错了就拦下,非法数据根本进不了门。
📝 本节和前面几节的关系
前三章的顺序是:数据库是什么(第一章)→ 数据怎么摆(第二章的表)→ 怎么用 SQL 增删改查(第三章)。但是有个前提一直没细说:建表时每个列后面都跟着一个词——INT、VARCHAR……那就是数据类型。第三章 3-5 建 students 表时已经用过它们,本节开始把它们逐个讲透:先总说「类型为什么重要」,后面四节(4-2~4-5)分家族细讲。
一、没有类型的世界会怎样
想象一张表格,任何人想填什么就填什么:
- 「成绩」列里混进了
九十分、59.5、缺考、甚至一张图片 - 想算全班平均分?程序得先猜每个格子里的东西能不能当数字用
这就是没有类型约束的世界:数据五花八门,处理它的程序苦不堪言。数据库最擅长的事之一,就是替你把好这道门。
二、类型是建表时定下的「合同」
在 3-5 建表时,我们已经写过:
CREATE TABLE students (
id INT,
name VARCHAR(20),
score DECIMAL(5,2)
);
每一列后面的 INT、VARCHAR(20)、DECIMAL(5,2),就是这一列的数据类型。它相当于一份合同:
- 进来的数据必须符合:往
score里塞abc,数据库直接报错拒绝 - 出去的数据必然符合:读的时候不用猜,
score拿出来一定是数字
三、类型管住的三件事
| 管什么 | 举例 |
|---|---|
| 长什么样 | INT 列进不来 hello;DATE 列进不来 明天 |
| 占多大地方 | VARCHAR(20) 装不下 21 个字符;定好类型,数据库才知道每条记录占多少空间 |
| 能做哪种运算 | INT 能加减求平均;DATE 能比先后、算日期差——类型决定运算规则 |
四、类型选错的下场
- 太窄:
TINYINT存年龄够用,存存款就溢出 - 太松:什么都塞
TEXT,想按数字排序时就得临时转换,又慢又容易错 - 不精确:钱用
FLOAT存,会出现0.1 + 0.2 = 0.30000000000000004这类怪账(4-2 细讲)
所以选类型的原则是:刚好够用、贴合本质。
五、四大类型家族(后面四节逐个讲)
| 家族 | 代表 | 管什么 |
|---|---|---|
| 数值 | INT DECIMAL FLOAT DOUBLE |
数字、金额(4-2) |
| 字符串 | CHAR VARCHAR TEXT |
姓名、地址、文章(4-3) |
| 日期时间 | DATE DATETIME |
生日、下单时间(4-4) |
| 布尔 | BOOLEAN |
真/假、是/否(4-5) |
六、动手 Demo:亲眼看看类型怎么拦人
在在线 SQLite 运行器(第三章 3-1 提过的环境)里跑:
CREATE TABLE t1 (
id INT,
name VARCHAR(20)
);
-- 合法:类型对得上,进去
INSERT INTO t1 VALUES (1, '张三');
-- 非法:往 INT 列塞字符串,数据库报错拦下
INSERT INTO t1 VALUES ('abc', '李四');
第二条语句会报错(SQLite 对部分值会宽容转换,MySQL 严格模式会直接拒绝)——无论哪种数据库,类型检查这层门都在,只是松紧不同。
七、30 秒实验
把 score DECIMAL(5,2) 改成 score TEXT 重新建表,塞进 九十分 也照收。再想想:这样一张表,3-17 的 AVG(score) 还能算吗?(会返回 0 参与运算或报错——类型一松,聚合函数立刻遭殃。)
八、常见误区
- 「数据库反正能自动转,类型随便填」:隐式转换有坑——
'10' + 5在某些数据库是 15,在另一些直接报错,生产系统绝不赌运气 - 「类型只影响存储大小,不影响对错」:类型是合法性判断的依据,不是单纯的省空间手段
自测三问
1. 数据类型在什么时候指定?(建表 CREATE TABLE 时,对每一列指定) 2. 类型管住哪三件事?(长什么样/占多大地方/能做哪种运算) 3. 为什么不能什么都用 TEXT?(合法性和运算全失效——数字排序、AVG 聚合都会出问题)- ☐ 下一节(4-2 INT、DECIMAL、FLOAT、DOUBLE-处理数值的数据类型)
相关笔记
- CREATE TABLE、DROP TABLE-创建和删除表 —— 第一次见到类型的地方
- 表、列、记录、字段-以表格形式存储数据 —— 列的「数据类型是硬约束」在本章正式展开
- 🗄️ 数据库基础 · 索引 —— 全课路线图