# P08 08. 基础-SQL-DDL-数据类型及案例

> 本页是学习笔记，不等同于视频逐字稿。原声字幕未取得（匿名接口字幕轨为空且需登录，未使用任何账号），也没有逐句讲解记录；讲义只按节与页码对应，切点未逐句确证。

> 以同版讲义的公开镜像核对章节与页码（镜像非官方出品）；非逐字稿，示例为原创补充。

## P08 08. 基础-SQL-DDL-数据类型及案例

- 原视频：https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=8（p=8），时长 20:44
- 讲义：2.3.2.2 数据类型 / 2.3.2.3 表操作-案例 p20–23（公开镜像；按主题对应，切点 notexact）

- 本集练习数据：practice/p08.sql（先执行，再对照小例）

### 一句话理解

建表时要给每个字段挑类型：挑小了存不下，挑大了浪费。这一集过一遍数值、字符串、日期三类常用类型，再用员工表案例练手。

### 步骤

1. 数值类型按范围从小到大：TINYINT（1 字节）、SMALLINT、MEDIUMINT、INT（4 字节）、BIGINT（8 字节），还有 FLOAT、DOUBLE 和精确小数 DECIMAL。年龄用 TINYINT UNSIGNED 就够，还顺便挡掉负数。
2. 字符串用 CHAR(n) 定长、VARCHAR(n) 变长。姓名、工号这类短文本用 VARCHAR，长度按业务上限给，不是越大越好。
3. 日期时间：DATE 只要年月日、TIME 只要时分秒、DATETIME 存年月日+时分秒（范围到 9999 年）、YEAR 只存年份、TIMESTAMP 也存日期+时间但只占 4 字节、范围到 2038-01-19。入职时间只要日期就用 DATE；要存「某时刻」用 DATETIME；2038 年以后的时间（比如长期合同到期日）不能用 TIMESTAMP。
4. 案例需求是“设计一张员工信息表”：编号纯数字、工号≤10 位、姓名≤10 位、性别一个汉字、年龄非负、身份证 18 位可能含 X、入职时间到日。逐条翻译成类型，就是下面这条建表语句。

### SQL 示例

```
CREATE TEMPORARY TABLE emp_case (
  id INT COMMENT '编号',
  workno VARCHAR(10) COMMENT '工号',
  name VARCHAR(10) COMMENT '姓名',
  gender CHAR(1) COMMENT '性别',
  age TINYINT UNSIGNED COMMENT '年龄',
  idcard CHAR(18) COMMENT '身份证号',
  entrydate DATE COMMENT '入职时间'
);
DESC emp_case;
```

说明：七个字段对应七条需求：`id` 用 INT；`workno`、`name` 用 VARCHAR(10) 卡住 10 位；`gender` 用 CHAR(1) 正好一个汉字；`age` 用 TINYINT UNSIGNED 保证非负；`idcard` 用 CHAR(18)，因为长度固定且末位可能是 X；`entrydate` 用 DATE。`DESC` 应返回 7 行，逐行看 Type 列就能对上设计。

### 四种日期 / 时间类型的实际取值

```sql
CREATE TABLE t_time (
  d DATE,
  dt DATETIME,
  y YEAR,
  ts TIMESTAMP
);
INSERT INTO t_time VALUES
  ('2026-10-22', '2026-10-22 08:30:00', 2026, '2026-10-22 08:30:00');
SELECT d, dt, y, ts FROM t_time;
```

说明：一行结果：2026-10-22、2026-10-22 08:30:00、2026、2026-10-22 08:30:00。DATE 与 DATETIME 的区别就是「要不要时分秒」；YEAR 只能存年份；TIMESTAMP 范围到 2038 年，超出会报错，而 DATETIME 能存到 9999 年。这里只记用途和范围，不展开时区换算。

预期结果：2026-10-22 | 2026-10-22 08:30:00 | 2026 | 2026-10-22 08:30:00

### 易错点

- 年龄用 INT：能存但占 4 字节，而 TINYINT UNSIGNED 还能顺便挡住负数。
- 身份证用 INT 或 VARCHAR 太短：18 位超出 INT 范围，末位 X 也不是数字，必须用字符型。
- 字符串长度按“现在够用”给。后面加长只能 ALTER，生产上改大表有成本。

### 30 秒速记

整数按范围选；精确小数用 DECIMAL；短文本 VARCHAR、定长 CHAR；日期用 DATE；类型本身就是一层约束。

### 自测

1. 身份证号为什么不能用 INT 存？
   - 答：INT 只有 4 字节，放不下 18 位数字；而且二代身份证末位可能是字母 X，不是数值。CHAR(18) 定长、能存字母，才匹配这个字段。
2. CHAR 和 VARCHAR 该怎么选？
   - 答：长度基本固定的短字段（性别、身份证、国家代码）用 CHAR，省去长度前缀；长度差别大的（姓名、地址）用 VARCHAR，避免定长浪费。

### 材料与来源

- [平台视频页] B站原视频 P08《08. 基础-SQL-DDL-数据类型及案例》 https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=8
- [平台视频页] 本集采样画面 p08_t20.jpg（约 248s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=8
- [平台视频页] 本集采样画面 p08_t80.jpg（约 994s） https://www.bilibili.com/video/BV1Kr4y1i7ru/?p=8
- [官方文档] MySQL 8.0 Reference Manual: Data Types https://dev.mysql.com/doc/refman/8.0/en/data-types.html

证据说明：讲义 p20–23「2.3.2.2 数据类型 / 2.3.2.3 案例」为主要依据：数值表、日期时间表（DATE/TIME/YEAR/DATETIME/TIMESTAMP，含 1/3/4/8 字节与范围）与员工表建表案例。原声字幕未取得（匿名接口字幕轨为空），讲师逐句讲解未核；正文示例为原创，四种类型的取值在 MySQL 8.0.46 实跑核对。
