一.概述
1.声明数据类型时可以给数据类型设置属性
2.常见的数据类型属性:
关键字 | 含义 |
---|---|
NULL | 数据列允许包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET ‘字符集’ | 指定一个字符集 |
二.整数类型
1.类型:
整数类型 | 字节 | 有符号数取值范围 | 无符号数取值范围 |
---|---|---|---|
TINYINT | 1 | -128~127 | 0~255 |
SMALLINT | 2 | -32768~32767 | 0~65535 |
MEDIUMINT | 3 | -8388608~8388607 | 0~16777215 |
INT,INTEGER | 4 | -2147483648~2147483647 | 0~4294967295 |
BIGINT | 8 | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 |
2.可选属性:
(1)M:表示显示宽度,M的范围是(0,255),当数据宽度小于设定值时,数字前要用字符填充,需配合”ZEROFILL”属性一起使用,表示用0填满宽度,否则指定显示宽度无效
- 例子:id INT(7) ZEROFILL;
- 使用会自动设置UNSIGNED
- 插入的数据大于设置的宽度不会有影响
- MySQL8.0.17开始不推荐使用此属性
- 不设置的话系统会自动给设置默认值
(2)UNSIGNED:无符号类型(非负)
- 所有的整数类型都可设置该属性
- 无符号整数最小取值为0
- 所以使用非负整数时,可以设置为无符号数
- id INT UNSIGNED;
3.如何选择整数类型:
(1)占用字节数少的节省空间
(2)在确认取值范围后选择尽量节省空间的,取值超过范围会报错,保证不会报错再去考虑节省空间
(3)系统故障产生的成本远远大于存储空间的成本
三.浮点类型
1.类型:
类型 | 有符号数取值范围 | 无符号数取值范围 | 占用字节数 |
---|---|---|---|
FLOAT | (-3.402823466E+38,-1.175494351E-38),0,(1.175494351E-38,3.402823466351E+38) | 0,(1.175494351E-38,3.402823466E+38) | 4 |
DOUBLE | (-1.7976931348623157E+308,-2.2250738585072014E-308),0,(2.2250738585072014E-308,1.7976931348623157E+308) | 0,(2.2250738585072014E-308,1.7976931348623157E+308) | 8 |
2.可选属性:
(1)FLOAT(M,D)或DOUBLE(M,D):M代表精度,D代表标度
- M就是整数位+小数位 (D<=M<=255)
- D=小数位 (0<=D<=30)
- MySQL8.0.17开始不推荐使用此属性
(2)UNSIGNED:无符号数
- 所有的浮点数类型都可设置该属性
- 无符号浮点数不能低于0
- 所以使用非负浮点数时,可以设置为无符号数
- FLOAT(3,2) UNSIGNED 就表示0-9.99
3.浮点数会存在误差,不精准
四.定点数类型
1.MySQL只有一种定点数类型:
| 类型 | 字节数 | 含义 | | —- | —- | —- | | DECIMAL(M,D),DEC,NUMERIC | M+2 | 有效范围由M和D决定 |
2.使用:
(1)表示高精度小数
- M为精度,0<=M<=65
- D为标度,0<=D<=30
- D<M
- 例如定义DECIMAL(5,2),取值范围就是-999.99~999.99
(2)最大取值范围于DOUBLE一样
(3)以字符串形式存储
(4)不指定精度和标度默认按(10,0)处理
3.定点数 VS 浮点数
(1)浮点数取值范围大,但是不精准,适用于可以容忍误差的场景
(2)定点数范围相对小,但是精准,没有误差,适用于对精度要求极高的场景
五.位类型
1.类型:存储二进制类型
类型 | 长度 | 长度范围 | 占用空间 |
---|---|---|---|
BIT(M) | M | 1<=M<=64 | 约(M+7)/8个字节 |
2.说明:
六.日期与时间类型:
1.类型:
类型 | 名称 | 字节 | 格式 | 最小值 | 最大值 |
---|---|---|---|---|---|
YEAR | 年 | 1 | YYYY | 1901 | 2155 |
TIME | 时间 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
DATE | 日期 | 3 | YYYY-MM-DD | 1000-01-01 | 9999-12-03 |
DATETIME | 日期时间 | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 日期时间 | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 UTC | 2038-01-19 03:14:07UTC |
2.说明:
(1)YEAR类型通常用来表示年
(2)TIME类型通常用来表示时分秒
(3)DATE类型通常用来表示年月日
(4)DATETIME类型通常用来表示年月日时分秒(使用最多)
(5)TIMESTAMP类型通常用来表示带时区的年月日时分秒
3.其他说明:
(1)TIME类型不仅表示一天的时间外,还可以表示时间间隔
(2)使用CURRENT_DATE()或NOW()函数,会插入当前系统时间
七.文本字符串类型
1.类型:
类型 | 值的长度 | 长度范围 | 占用的存储空间 |
---|---|---|---|
CHAR(M) | M | [0,255] | M个字节 |
VARCHAR(M) | M | [0,65535] | M+1个字节 |
TINYTEXT | L | [0,255] | L+2个字节 |
TEXT | L | [0,65535] | L+2个字节 |
MEDIUMTEXT | L | [0,16777215] | L+3个字节 |
LONGTEXT | L | [0,4294967295] | L+4个字节 |
ENUM | L | [0,65535] | 1或2个字节 |
SET | L | [0,64] | 1,2,3,4或8个字节 |
2.CHAR和VARCHAR详细说明:
(1)CHAR(M)要预先指定长度,不然默认为1个字符
(2)CHAR数据的实际长度小于声明长度,右侧会自动填充空格
(3)VARCHAR是可变长度,但不能超出声明长度
(4)简短和固定长度选择CHAR,其余选择VARCHAR
(5)CHAR(10)和VARCHAR(10)区别:
- CHAR即使存一个字节,也会占用十个字节的空间
- VARCHAR存几个字节就占几个字节
3.TEXT详细说明:
(1)MySQL不允许TEXT类型做主键
(2)尽量减少使用4.ENUM枚举类型具体说明:
(1)表示在给出的枚举类型中选择
(2)添加的值必须是ENUM后给出的
(3)可以用索引引用枚举类型的值
(4)忽略大小写
(5)每次只能添加一个CREATE TABLE test(
season ENUM('春','夏','秋','冬')
);
5.SET类型说明:
(1)可以添加多个值,放在同一个引号内 逗号隔开
(2)添加的值必须是SET后给出的
(3)插入数据时,会自动删除重复成员
(4)插入不存在的成员会报错CREATE TABLE test(
s SET('A','B,'C','D')
);
八.二进制类型
1.二进制字符串主要存储二进制数据,比如图片音频等
2.BINARY与VARBINARY类型:
(1)参考CHAR,VARCHAR,只不过这两个存储二进制3.BLOB类型:
| 类型 | 值的长度 | 长度范围 | 占用空间 | | —- | —- | —- | —- | | TINYBLOB | L | [0,255] | L+1个字节 | | BLOB | L | 0,65535 | L+2个字节 | | MEDIUMBLOB | L | 0,16777215 | L+3个字节 | | LONGBLOB | L | 0,4294967295 | L+4个字节 |
(1)BLOB是二进制大对象,可以容纳可变数量的数据
(2)保存图片视频音频等
九.JSON类型
1.JSON是轻量级数据交换格式
2.JSON可以将JavaScript对象中表示的一组数据转换为字符串,在网络或程序中传递他,并在需要时还原为各语言支持的数据格式
3.举例:
CREATE TABLE test_json(
js json
);
#插入数据
INSERT INTO test_json(js)
values('{"name":"sfsaf","age":18...}');