| 整数类型 | 字节 | 范围 |
|---|---|---|
| Tinyint | 1 | 有符号:-128~ 127,无符号:0~255 |
| Smallint | 2 | 有符号:-32768~32767,无符号 |
| Mediumint | 3 | 有符号:-8388608~ 8388607 |
| Int/integer | 4 | 有符号:-2147483648 ~ 2147483647 |
| Bigint | 8 | 有符号:-9223372036854775808 ~ 9223372036854775807,无符号:0~ 9223372036854775807*2+1 |
1、如何设置无符号和有符号
create table 表名(
t1 INT, # 设置有符号(默认)
t2 INT UNSIGNED # 设置无符号
# 如果添加的是负数,那么结果查询后显示为0
)
2、如果插入的数据超过整型的取值范围,会报out of range异常,并且插入临界值。
3、如果不设置长度,会有默认长度
| 浮点数类型 | 字节 | 范围 |
|---|---|---|
| float(M,D) | 4 | ±1.75494351E^ 38~±3.402823466EE^38 |
| double(M,D) | 8 | 很大~~~ |
| 定点数类型 | 字节 | 范围 |
|---|---|---|
| DEC(M,D),DECIMAL(M,D) | M+2 | 最大取值范围与double相同,给定decimal的有效取值范围由M和d决定 |
(1)M和D的含义
M:整数部分位数+小数部分位数
D:保留的小数位数(四舍五入)
(2)M和D都可以省略
(3)如果时decimal定点型,则M默认为10,D默认为0
如果是float和double类型,则会根据插入的数值的精度来决定精度
(4)定点型的精确度较高,如果要求插入数值的精度较高,如货币运算等则考虑使用定点型。
| 字符串类型 | 最多字符数 | 描述及存储需求 | 区别 |
|---|---|---|---|
| char(M) | M | M为0~255之间的整数 | 固定长度的字符,比较耗费空间,效率高点 |
| varchar(M) | M | M为0~65535之间的整数 | 可变长度的字符,没那么耗费空间,效率低点 |
| 字符串类型 | 描述及存储需求 |
|---|---|
| text | 存储长文本类型 |
| blob | 存储图片类型 |
| 日期类型 | 字节数 | 最小值 | 最大值 |
|---|---|---|---|
| date | 4 | 100-1-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 | 2038年的某个时刻 |
补充:
datetime和timestamp的区别
(1)timestamp支持的时间范围较小,datetime的取值范围相对较大
(2)timestamp和实际时区有关,更能反映实际的日期,而datetime则只能反映出插入时的当地时区
(3)timestamp的属性收mysql版本和sqlMode的影响很大
要求插入的值必须属于列表中指定的值之一。
例如:
# 建表,定义一个枚举类型的数据
create table tab_char(
c1 ENUM('a','b','c')
);
# 插入值
insert into tob_char values('a'),('b'),('c');
# 如果插入列表意外的值,则会报错
insert into tob_char values('m'); # 报错
set用来保存集合
和Enum类型类似,里面可以保存0~64个成员。
和Enum类型最大的区别是:set类型一次可以选取多个成员,而Enum只能选一个。根据成员个数不同,存储所占的字节也不同

create table tab_set(
s1 SET('a','b','c','d')
)
insert into tab_set values('a');
insert into tab_set values('a,b');
insert into tab_set values('a,b,c');
结果
