一.概述

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)ZEROFILL:用0填充,与M属性配合使用

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)若不指定M,默认为1

六.日期与时间类型:

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)每次只能添加一个
    1. CREATE TABLE test(
    2. season ENUM('春''夏''秋''冬')
    3. );

    5.SET类型说明:

    (1)可以添加多个值,放在同一个引号内 逗号隔开
    (2)添加的值必须是SET后给出的
    (3)插入数据时,会自动删除重复成员
    (4)插入不存在的成员会报错
    1. CREATE TABLE test(
    2. s SET('A''B,'C','D')
    3. );

    八.二进制类型

    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.举例:

  1. CREATE TABLE test_json(
  2. js json
  3. );
  4. #插入数据
  5. INSERT INTO test_json(js)
  6. values('{"name":"sfsaf","age":18...}');