一、常见数据类型
1、数值型
1.1整型
数据类型 | 字节 | 范围 |
TINYINT | 1 | 有符号:(-128,127) 无符号:(0,255) |
SMALLINT | 2 | 有符号:(-32 768,32 767) 无符号:(0,65 535) |
MEDIUMINT | 3 | 有符号:(-8 388 608,8 388 607) 无符号:(0,16 777 215) |
INT或INTEGER | 4 | 有符号:(-2 147 483 648,2 147 483 647) 无符号:(0,4 294 967 295) |
BIGINT | 8 | 有符号:(-9,223,372,036,854,775,808,9 223 372 036 854 775 807) 无符号:(0,18 446 744 073 709 551 615) |
- 默认是有符号,如果要设置无符号,在类型后面添加UNSIGNED 比如:
CREATE TABLE 数据表 (
列1 INT (显示长度)【ZEROFILL】,#显示长度代表了可显示的最大宽度,如果不写,INT默认长度为11,不够显示长度的数据,并且搭配了ZEROFILL 系统会自动补充0
列2 INT UNSIGNED ) #列2 就设置了无符号,只能为正数,范围更大
- 如果插入数据超出范围 。系统会给出out of range异常,实际插入数据的临界值。
1.2 小数 浮点数 和 定点数
浮点数类型 | 字节 | 范围 |
FLOAT | 4 | 有符号:(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 无符号:0,(1.175 494 351 E-38,3.402 823 466 E+38) |
DOUBLE | 8 | 不用管,非常非常大 |
定点数类型 | 字节 | 范围 |
DECIMAL 简写DEC(M,D) | M+2 | 范围和double相同,有效值由M和D决定 |
写法:
float(M,D) double(M,D) DEC(M,D)
说明:
- (M,D)可以省略,省略后 浮点型(float和double)是根据插入的数字自动反推他们的长度。但是定点数默认长度为DEC(10,0)
- M指的是 整数部分长度+小数部分长度 如果超过范围,则插入临界值
- D指小数部分的有效数字(四舍五入规则,不足补0。
数值型使用原则 ☆
在满足需求的条件下。选择的数据类型越简单越好,能保存的数值类型越小越好(为了节约内存资源)
2、字符型
2.1短文本 char,varchar
字符串类型 | 最多字符数 | 描述及储存要求 |
CHAR(M) | M | M为 0~255之间的整数 |
VARCHAR(M) | M | M为0-65535之间的整数 |
注意事项:
char(M) 里面的(M)可以省略,默认值为1;VARCHAR的(M)不能省略
char 和 varchar 的选择:
char是固定长度字符,varchar是可变长度字符。比如char(10) 但只用了2个字符,另外8个就必须浪费掉。所以char会浪费空间,varchar比较节约空间。但是char的效率比VARCHAR效率高。 所以遇到比如存储名字,性别这种简单场景,建议用char,其他都用varchar
2.2长文本text,blob(较长的二进制数据,比如图像数据)
2.3 枚举类型
ENUM枚举类型
要求插入的值必须属于列表中指定的值之一。如果列表成员为1-255,则需要1个字节存储如果列表成员为255-65535,则需要2个字节存储最多需要65535个成员!
exp:
create table 某数据表(
列1 ENUM (‘x’,'y','z') #后面插入某数据表列1的数据,必须为x,y,z之一,不区分大小写,只能插一个
);
SET类型 用于保存集合
说明:和Enum类型类似,里面可以保存0-64个成员。和Enum类型最大的区别是: SET类型一次可以选取多个成员,而Enum只能选一个根据成员个数不同,存储所占的字节也不同。同样不区分大小写
exp:
create table 某数据表(
列1 SET (‘x’,'y','z','m') #后面插入某数据表列1的数据,必须为x,y,z,m里面的任意多个,不区分大小写,可插多个
);
插入语句
INSERT INTO 某数据表 VALUES('x,y'); #在某数据表的列1插入(x,y)。执行插入的时候,逗号隔开就好了,不用每个都去打单引号
3、日期型 日期必须用单引号引起来
日期类型 | 字节 | 范围 | 格式 |
DATE 只保存日期 | 4 | 1000-01-01—9999-12-31 | YYYY-MM-DD |
DATETIME 保存时间和日期 常用 | 8 | 1000-01-01 00:00:00—9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS |
TIMESTAMP 保存时间和日期 常用 | 4 | 970-01-01 00:00:00—2038年某个时刻 | YYYY-MM-DD HH:MM:SS |
TIME 只保存时间 | 3 | '-838:59:59'—'838:59:59' | HH:MM:SS |
YEAR 只保存年 | 1 | 1901—2155 | YYYY |
DATETIME和TIMESTAMP选择:
1、Timestamp支持的时间范围较小,取值范围:19700101080001-2038年的某个时间 Datetime的取值范围: 1000-1-1--9999-12-31
2、timestamp和实际时区有关,更能反映实际的日期,而datetime则只能反映出插入时的当地时区
3、timestamp的属性受Mysql版本和SQLMode的影响很大
由于timestamp占的空间小,并且更能反映实际时间,所以一般都用timestamp,超过范围再用datetime