在mysql中数据大致可以分为

  • 数值型。包括整型、小数(定点数、浮点数)
  • 字符型。较短的字符(char、vchar)、较长的文本(text、blob)
  • 日期

整数(5种)

mysql中整型分为以下五种

类型

tinyint

smallint

mediumint

int/integer

bigint

所占字节数(一个字节八位)

1

2

3

4

8

  • 无符号和有符号
    以上五种整型都可分为无符号和有符号,无符号整型的所有位数都用于表示数值,其数值范围>=0。
    有符号整型符号占一位,其数值有正负。
    默认情况下,mysql的整型为有符号整型,即数值有正负。可使用unsigned关键字设置无符号整型.
CREATE TABLE type1(
	t1 INT,   //默认有符号
    t2 int unsigned  //显式声明无符号
)
  • 取值范围
    五种整型各占的字节数限制了对应的取值范围。若插入的数值超过定义的范围,会报out of range警告,但依旧执行插入操作,且插入临界值。
#定义表
CREATE TABLE type1(
	t1 TINYINT  //有符号,范围-128-127
)
#插入数据超出范围
INSERT INTO type1 (t1) VALUE(-1288) //超出范围,应该是插入-128.实验未插入任何值。
  • 显示宽度
    在定义表结构时,可自定义列的显示宽度,不足宽度部分在左侧填充0。每个类型都有默认的宽度,且默认不会把填充的0显示出来,可使用zerofill关键声明显示0。
    注意该特点只对正整数有效,即无符号整型。
CREATE TABLE type2(
	t1 TINYINT(10) ZEROFILL,   //设置显示宽度为10,填充后显示
	t2 TINYINT(5),           //设置显示宽度为5 ,填充后不显示
    t3 TINYINT               //默认显示宽度为54,填充后不显示
)

INSERT INTO type2 (t1,t2,t3) VALUE(124,124,124)
SELECT * FROM type2
#输出结果
|        t1| t2| t3|
|0000000124|124|124|

小数(3种)

小数可以分为浮点型和定点型。其中浮点型包括

  • float(M,D):占4个字节
  • double(M,D):占8个字节

定点型包括以下两种,字节长度为M+2。

  • dec(M,D)
  • decimal(M,D)

在浮点型和定点型中,M表示数值的总宽度(包含D的宽度),D表示小数点的位数。若超过范围,则插入临界值。

若M、D缺省,mysql会默认定点型的(M,D)为(10,0);默认浮点型根据插入数值的精度自适应决定精度。

在定义列类型时,一般选用满足业务需求的最简单类型。对于精度要求高的场景,比如货币计算等,可使用定点型小数。

字符型

字符型根据长度可分为

较短的文本

类型

语法

M含义

特点

空间耗费

性能

使用场景

固定字符

char(M)

最大的字符数,可缺省,默认1

固定长度的字符串

定义之后即固定,不会伸缩。空间耗费高


字段长度确定,例如性别

可变长字符

varchar(M)

最大的字符数,不可缺省

字符串的实际长度会自动伸缩

需要多少提供多少,空间利用率高低


字符长度不确定

较长的字符

  • text
  • blob:存储较大的二进制

枚举类型

在定义字段时,给列设定值范围。当插入值时,只能插入范围内的某一个值。否则报错。

查询时该列是一个单选下拉框

create table test_enum(
	grade enum('a','b','c')  //表示grade列只能从三个字符中选一个插入,插入其他值报错。
)

set类型

set作用类似枚举类型,不同的是,set类型可以插入取值范围内的多个值。

查询时该列是一个多选下拉框

create table test_set(
	grade set('a','b','c')  //表示grade列只能从三个字符中任选多个插入,插入其他值报错。
)
insert into test_set values('a,b')

日期型

类型

所占字节

最小值

最大值

特点

date

4

1000-01-01

9999-12-31

只保存日期

time

3

-838:59:59

838:59:59

只保存时间

year

1

1901

2155

只保存年份

datetime

8

1000-01-01 00:00:00

9999-12-31 23:59:59

格式化、易读的日期+ 时间

timestamp

4

1970-0101080001

2038年某个时刻

未格式化的日期+时间

timestamp比datetime支持的时间范围小,且timestamp受实际时区、mysql版本、sqlmode影响,更接近真实业务时间、常用。