1、前言

在现实世界中, 数据的种类有很多,
比如, 人的姓名(字符), 人的年龄(整型), 人的身高(小数), 出生日期(日期)
而MySQL就是用来保存这些数据的, 所以在 MySQL中, 将数据分为三大类:

  • 数值型
  • 字符串
  • 日期与时间

学习目的
通过学习, 大概了解怎么选择合适的数据类型
4、数据类型 - 图1

1.数值—整型

类型 名称 说明 无符号范围 有符号范围
整型 tinyint 微整型, 占8位二进制 0~255 -127~128
smallint 小整型, 占16位二进制 0~65535(6万) -32767~32768
int 整型 0~42亿
bigint 大整型 0~200亿亿

选型

一个人的年龄age: tinyint
大学一个学校的学生序号student_num: int
大型电商网站的商品表的序号goods_num: int
马云的资产mayun: bigint
说明
在mysql中, 默认的整型是带符号的, 如果要定义无符号整型, 需要加上unsigned
示例
CREATE TABLE user (
age tinyint unsigned,
student_num smallint unsigned,
goods_num int unsigned,
mayun bigint
);

2、数值—小数

小数分为

  • 浮点
    • 单精度
    • 双精度
  • 定点

浮点型的数据不精确, 所以一般表示价格, 我们使用定点型

类型 名称 说明
小数 float(m,d) m(精度), 表示总位数, d(标度), 表示小数点后的位数
double(m,d) m(精度), 表示总位数, d(标度), 表示小数点后的位数
decimal(m,d) m(精度), 表示总位数, d(标度), 表示小数点后的位数

选型
距离: 3.4 km float(10,2)
人的体重: 80.5kg float(5,2)
价格: 9.9 RMB decimal(10,2)
示例
CREATE TABLE t_float (
distance float(10,2),
weight float(5,2),
price decimal(10,2)
);

3、字符串

类型 名称 说明
字符型 char(M)定长 无论使用几个字符都占满全部, 范围0~255字符
varchar(M)变长 使用几个字符就占用几个, 理论范围0~65535字符
text 允许长度 0~65535 字节
enum(集合) 枚举, 集合表示选项, 以逗号隔开
text类型 tinytext 1kb
text 64kb
mediumtext 16MB
longtext 4GB

选型
char类型: 固定长度, 一般用于存储固定长度的字符串, 如

  • 手机号 char(11)
  • 通过md5加密后的密码值char(32)

varchar类型: 可变长度, 存储长度不确定的字符字符串, 如

  • 姓名 varchar(16)
  • 邮箱 varchar(255)

text类型: 存储大段内容, 如

  • 文章内容 text

enum类型: 单选, 如

  • 性别

说明
char与varchar的区别

  • char是固定的长度 char(5) 保存 abc, 实际占用的空间5个
  • varchar最大长度 varchar(5)保存abc, 实际占用的空间3个

varchar用多少就占多少
示例

  1. char(11) //表示不能超过11位

CREATE TABLE t_char (
phone char(11),
password char(32),
name varchar(16),
email varchar(255),
content text,
sex enum(‘男’,’女’)
);
说明
char(M)与varchar(M)中的M表示的字符数

4、日期与时间

类型 名称 说明
日期 date 范围1000-01-01~9999-12-31
datetime 范围1000-01-01 00:00:00~9999-12-31 23:59:59
timestamp 从1970年开始至今的秒数

选型
出生日期: date
商品抢购的开始结束时间: datetime
文章的创建更新时间: timestamp(时间戳)
说明
时间戳: 从1970年1月1日0时0分0秒到当前时间的秒数(整数)
一般时间类型更常见的是保存时间戳, 时间戳就是一个整型数, 为什么保存时间戳呢?

  1. 效率更高
  2. 方便处理

示例
CREATE TABLE t_time (
birthday date,
start_time datetime,
end_time datetime,
created_time timestamp
);