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

数据类型是数据库的第一道防线:建表时给每一列指定类型,之后所有数据想进这列,都必须先过「类型检查」这一关——错了就拦下,非法数据根本进不了门。

📝 本节和前面几节的关系

前三章的顺序是:数据库是什么(第一章)→ 数据怎么摆(第二章的表)→ 怎么用 SQL 增删改查(第三章)。但是有个前提一直没细说:建表时每个列后面都跟着一个词——INT、VARCHAR……那就是数据类型。第三章 3-5 建 students 表时已经用过它们,本节开始把它们逐个讲透:先总说「类型为什么重要」,后面四节(4-2~4-5)分家族细讲。

一、没有类型的世界会怎样

想象一张表格,任何人想填什么就填什么:

这就是没有类型约束的世界:数据五花八门,处理它的程序苦不堪言。数据库最擅长的事之一,就是替你把好这道门。

二、类型是建表时定下的「合同」

在 3-5 建表时,我们已经写过:

CREATE TABLE students (
    id    INT,
    name  VARCHAR(20),
    score DECIMAL(5,2)
);

每一列后面的 INT、VARCHAR(20)、DECIMAL(5,2),就是这一列的数据类型。它相当于一份合同:

  1. 进来的数据必须符合:往 score 里塞 abc,数据库直接报错拒绝
  2. 出去的数据必然符合:读的时候不用猜,score 拿出来一定是数字

三、类型管住的三件事

管什么 举例
长什么样 INT 列进不来 hello;DATE 列进不来 明天
占多大地方 VARCHAR(20) 装不下 21 个字符;定好类型,数据库才知道每条记录占多少空间
能做哪种运算 INT 能加减求平均;DATE 能比先后、算日期差——类型决定运算规则

四、类型选错的下场

所以选类型的原则是:刚好够用、贴合本质。

五、四大类型家族(后面四节逐个讲)

家族 代表 管什么
数值 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 参与运算或报错——类型一松,聚合函数立刻遭殃。)

八、常见误区

自测三问 1. 数据类型在什么时候指定?(建表 CREATE TABLE 时,对每一列指定) 2. 类型管住哪三件事?(长什么样/占多大地方/能做哪种运算) 3. 为什么不能什么都用 TEXT?(合法性和运算全失效——数字排序、AVG 聚合都会出问题)

相关笔记