第05周 数据库创建与MySQL数据类型
第5周 · 数据库创建与 MySQL 数据类型
装好 MySQL 之后,第一件事是"建库"。这周学怎么创建一个数据库、怎么给字段选对类型。字段类型选错,后面存数据会出各种奇怪问题,所以建库前先设计是工程规范。
一、知识点:数据库与数据表的关系
数据库(Database):存放若干张表的"文件夹/容器",如school。数据表(Table):数据库里一张二维表,如student。- 顺序:先建库 → 再建表 → 最后插数据。库都不存在就建表会报错。
二、操作教程:创建数据库
-- 创建 school 库,指定字符集 utf8mb4、校对规则 utf8mb4_general_ci
CREATE DATABASE school
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- 更稳妥的写法:库已存在就不报错
CREATE DATABASE IF NOT EXISTS school
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
务必带
CHARACTER SET utf8mb4,否则默认字符集可能不支持完整中文(如 emoji、""等生僻字),后期改起来很麻烦。
三、操作教程:查看 / 切换 / 删除数据库
SHOW DATABASES; -- 查看所有数据库
USE school; -- 切换到 school 库(后续操作都在它里面)
SELECT DATABASE(); -- 查看当前所在库
DROP DATABASE school; -- 删除整个库(危险!库和里面的表全没)
DROP DATABASE不可恢复,练习时确认无误再执行,考试/生产环境更要谨慎。
四、知识点:MySQL 数据类型三大类
| 大类 | 常用类型 | 用途 |
|---|---|---|
| 数值型 | INT、BIGINT、DECIMAL、FLOAT |
整数、小数 |
| 字符串型 | CHAR、VARCHAR、TEXT |
文本 |
| 日期时间型 | DATE、DATETIME、TIMESTAMP |
日期、时间 |
五、知识点:数值类型怎么选
INT:普通整数(约 ±21 亿),学号、年龄、数量够用。BIGINT:超大整数(如订单号、主键自增到大数时)。DECIMAL(M,D):精确小数,金额必须用它,例如DECIMAL(10,2)表示共 10 位、小数 2 位。FLOAT/DOUBLE:浮点数,有精度误差,不适合金额。
金额千万别用
FLOAT!例如0.1 + 0.2在浮点里不等于0.3。金额一律DECIMAL。
六、知识点:CHAR 定长 vs VARCHAR 变长(重点)
这是最常考、最易混的一对:
| 类型 | 含义 | 存储 | 适用 |
|---|---|---|---|
CHAR(n) |
定长,固定占 n 个字符 | 不管实际多长都占 n 位,不足补空格 | 长度固定的,如性别 CHAR(1)、身份证 CHAR(18) |
VARCHAR(n) |
变长,最多 n 个字符 | 按实际长度存,省空间 | 长度不定的,如姓名 VARCHAR(20)、地址 VARCHAR(100) |
示例:存"张"(1 个字)
- CHAR(20):占满 20 个字符位(补 19 个空格),浪费;
- VARCHAR(20):只占实际 1 个字 + 少量长度标记,省空间。
经验:长度基本固定用
CHAR,长度浮动大用VARCHAR。姓名、地址一律VARCHAR。
七、知识点:日期时间类型区别
| 类型 | 格式 | 含义 |
|---|---|---|
DATE |
2026-08-29 |
仅日期,无时间 |
DATETIME |
2026-08-29 14:30:00 |
日期+时间,范围大 |
TIMESTAMP |
2026-08-29 14:30:00 |
日期+时间,范围小,随时区变,常用于"最后修改时间" |
生日、入学日期用
DATE;下单时间、操作日志用DATETIME或TIMESTAMP。
八、字段类型选择原则
- 够用就好:如年龄用
TINYINT(0–255)比INT省,但教学阶段用INT也行。 - 金额用 DECIMAL:避免浮点误差。
- 文本用 VARCHAR:除非长度绝对固定才用
CHAR。 - 统一字符集 utf8mb4:建库建表都指定。
- 见名知意:字段名用英文,如
sname表示学生姓名。
九、综合操作:创建 student 表
USE school;
CREATE TABLE student (
sid INT, -- 学号(整数)
sname VARCHAR(20), -- 姓名(变长文本)
sage INT, -- 年龄(整数)
enroll DATE -- 入学日期(仅日期)
);
建完用 DESC student; 查看表结构,确认四个字段类型符合预期。
十、易混点排查表
| 现象 | 解决方法 |
|---|---|
No database selected |
建表前没 USE 库名;先切换库 |
| 中文存入乱码 | 建库/建表没指定 utf8mb4;统一用 utf8mb4 |
| CHAR 和 VARCHAR 分不清 | 记住:定长 CHAR、变长 VARCHAR |
| 金额算出误差 | 用了 FLOAT;改成 DECIMAL(M,D) |
DROP DATABASE 误删 |
该操作不可恢复,执行前二次确认 |
| 字段太长超 VARCHAR(n) | 实际长度超过 n 会截断/报错;把 n 调大 |
十一、小测验(自测)
- 创建
school库并指定utf8mb4的 SQL 怎么写?为什么字符集要指定 utf8mb4? - 姓名和性别分别该用
CHAR还是VARCHAR?为什么? - 金额字段为什么不能用
FLOAT?应该用哪个类型? DATE、DATETIME、TIMESTAMP三者的主要区别是什么?生日该用哪个?
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号