3. MySQL 数据类型怎么选
建表时每个字段都要指定数据类型,相当于规定"这个格子能装什么"。常用三大类:
| 类别 | 常用类型 | 用途示例 |
|---|---|---|
| 数值 | INT / TINYINT / DECIMAL | 年龄 TINYINT、工资 DECIMAL(10,2)、学号 INT |
| 日期时间 | DATE / DATETIME / YEAR | 出生日期 DATE、入职时间 DATE |
| 字符串 | CHAR / VARCHAR / TEXT | 姓名 VARCHAR(10)、性别 CHAR(1)、备注 TEXT |
选型的几个经验:
- 定长用
CHAR(如性别只占 1 字),变长用VARCHAR(如姓名长度不定); - 年龄不会为负 →
TINYINT UNSIGNED(无符号,0~255 够用); - 金额用
DECIMAL(M,D)避免浮点误差,不用 FLOAT; - 身份证固定 18 位 →
CHAR(18)(含 X 字符)。
💡 教材中的经典案例——员工表 emp:id INT、工号 VARCHAR(10)、姓名 VARCHAR(10)、性别 CHAR(1)、年龄 TINYINT UNSIGNED、身份证 CHAR(18)、入职时间 DATE。字段类型选得清清楚楚。
📝 本节例题
以下例题均基于 教学实例 库(student / course / sc / teacher / grades / dept / emp),开始前先执行 USE 教学实例;。建议先自己写一遍,再展开答案对照。
例 1
建一张 teacher_demo 表:教师号 varchar(10)、姓名 varchar(10)、入职日期 date。
查看参考答案(可复制)
sql
CREATE TABLE teacher_demo (
Tno varchar(10),
Tname varchar(10),
entrydate date
);💡 日期用 date,别用 varchar,否则无法直接比较大小。
例 2
建 sc_demo 表:学号 varchar(10)、课程号 varchar(10)、成绩 decimal(5,1)(保留 1 位小数);再建 stu_demo,年龄用 tinyint unsigned。
查看参考答案(可复制)
sql
CREATE TABLE sc_demo (
Sno varchar(10),
Cno varchar(10),
score decimal(5,1)
);
CREATE TABLE stu_demo (
Sno varchar(10),
sage tinyint unsigned
);💡 带小数的成绩用 decimal 而不是 float,避免精度误差;年龄 0~255 用 tinyint unsigned 最省空间。
例 3
按教学实例库的结构,写出 student 表的建表语句:8 个字段,学号为主键,身份证号定长 18 位。
查看参考答案(可复制)
sql
CREATE TABLE student (
Sno varchar(10) NOT NULL,
Sname varchar(10),
Sbirth date,
IDNum char(18),
Ssex varchar(10),
sage tinyint unsigned,
sbirthplace varchar(20),
class char(2),
PRIMARY KEY (Sno)
);💡 长度固定的身份证号用 char(18),长度不定的姓名用 varchar。