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。