在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影响,更接近真实业务时间、常用。