Skip to content

数据库中的数据类型

如果没有数据类型,那么MySQL就不知道需要分配多大的存储空间来存储数据。过大会造成资源的浪费, 体积变大效率变低,过小可能会导致数据溢出不能完整保存数据,所以MySQL提供数据类型的目的就是为了 让我们合理分配存储空间,降低数据库的体积,完整的保存数据,更好的对数据库进行优化

MySQL中的数据类型有哪些?

  • 整型、浮点型、定点型、字符型、文本型、枚举型、集合类型、日期类型、布尔类型

整型 - 专门用来保存整数的

  1. tinyint 1字节 (-128,127) (0,255) 小整数值
  2. smallint 2字节 (-32768, 32767) (0,65535) 大整数值
  3. mediumint 3字节 (-8388608,8388607) (0,16777215) 大整数值
  4. int/integer 4字节 (-2147483648,2147483647) (0,4294967295) 大整数值
  5. bigint 8字节 (-9223372036854775808,9223372036854775807) (0,18446744073709551615)

注意点:

  • MySQL中的整型和其他编程语言的整型一样,也区分有符号和无符号
    • 默认情况下整型是有符号的
    • 在数据类型的后面加上 unsigned 则变成无符号类型
    sql
        create table person(
            id int,
            age tinyint unsigned
        );
    
  • 在设计数据库的时候一定要合理的使用数据类型
    • 例如:年龄一般使用 tinyint 类型,人活不到255岁
  • 在保存数据的时候,如果超出了当前的数据类型的范围,那么就会报错
  • 在设置整型的时候,还可以设置整型数据将来显示的位宽
    • 现在设置将来显示整型的位宽是2,现在存储的数据是1位,那么将来查询出来的数据就会显示 1;
    • 例如:若想让2显示为02,则需要在创建表的时候设置位宽,不够则进行补零操作 create table person (id int,age tinyint(2) zerofill);
    • 如果存储的数据没有指定的位宽,那么会自动补空格或0,如果大于等于位宽,不做任何操作。

浮点型 - 专门用于保存小数的

float (m,d) 4字节 单精度 double (m,d) 8字节 双精度 m为总位数,d为小数位数

  • float和double 的区别

    • 占用存储空间大小不一样
    • 默认保存的小数位数不同
    • 保存数据的有效精度不同
  • 特点

    • 和其他编程语言中一样,浮点型是不准确的
    • 所以在企业开发中千万不能使用浮点数来保存用户的准确(珍贵)信息(RMB)

定点型 - 也是用于存储小数的

decimal (m,d) m总位数 d小数位

定点类型的本质:是将数据分为两个部分来存储,每个部分都是整数 所以定点数不能滥用,因为非常消耗资源

字符型 - 专门用来存储字符串的

char(size) 0-255字节 定长字符串 varchar(size) 0-65535字节 变长字符串

  • 区别
    • 能够保存的数据容量不一样
    • char不会回收多余的字符串,要多少给多少
    • varchar会回收多余的字符串,用多少给多少
      • 例如使用char(2) 存储'a' ,存储的结果是' a';
      • 使用varchar(2) 存储'a' ,存储的结果是'a';
      • 以上两种方式,如果是超过定义的范围,会报错

注意点:

  • 由于是字符类型,所以传递值建议使用单引号
  • varchar理论上是存储65535个字符,但是实际会随着当前数据库的字符集改变
    • 如果当前表的字符集为utf8 最大长度就是21845 ---- 65535/3 = 21845 一个字符占用三个字节,所以varchar在utf8表中最多存储21845
    • 如果当前表的字符集为gbk 最大长度就是32767 ---- 65535/2 = 32767 一个字符占用两个字节

大文本类型

MySQL中每一行存储的数据大小是有限制的,每一行最多只能存储65534个字节

例如:

sql

create table person(
    name1 char(3),
    name2 varchar(21845) #在utf8中相当于65535个字节
)charset=utf8;

创建的时候就会报错,因为name1和name2的总长度不能超过65534个字节

所以要通过大文本类型来解决这个问题

  • tinytext 0-255字节 短文本字符串
  • text 0-65535字节 长文本数据
  • mediumtext 0-16777215字节 中等长度文本数据
  • longtext 0-4294967295字节 极大文本数据

注意点:

大文本类型在表中并不会实际占用所能保存的字节数,而是利用10个字节引用了实际保存数据的地址

枚举类型

和其他编程语言一样,瑞国某个字段的取值只能是固定的一个值,那么可以使用枚举类型 enum(值1,值2,...)

sql

create table person(
    id int,
    gender enum('','','未知')
);

注意点:

  • MySQL中的枚举类型其实是通过整型来实现的
    • 和其他编程语言不同的是,其他语言的枚举是从0开始,而MySQL的枚举是从1开始的。 select gender+0 from person;
  • 由于底层是使用整型来实现的,所以我们也可以通过整数的方式来赋值 insert into values(1,1);后面的1即代表

集合类型

和编程开发中一样,如果某个字段的取值只能是几个固定值中的几个,那么就可以使用集合类型 set(值1,值2,...)

sql

create table person(
    id int,
    hobby set('篮球','足球','高尔夫','足浴')
)

insert into person values(1, '篮球,足球');

注意点:

  • 如果不在固定取值范围内会报错

  • 和枚举一样也是通过整型来实现的 MySQL的集合类型是按照2(n)的方式来实现的 ----- 2的n次方 篮球 ---- 2(0) = 1 足球 ---- 2(1) = 2 高尔夫 ---- 2(2) = 4 足浴 ---- 2(3) = 8 主要是为了方便位运算

布尔类型 - 专门用来保存真假的

sql

create table person(
    id int,
    flag boolean
)

insert into person values (1,'男');#会报错

insert into person values(1,true); #不报错

insert into person values(1,false); #不报错

注意点

  • MySQL中的布尔类型也是使用整型来实现的 0表示假 1表示真
    • 底层的本质使用C/C++ 来实现的所以非0即真

日期类型 - 专门用于保存日期

  • date 3字节 YYYY-MM-DD 日期值

  • time 3字节 HH:MM:SS 时间值或持续时间

  • datetime 8字节 YYYY-MM-DD HH:MM:SS 混合日期和时间值

sql

create table person(
    time1 date,
    time2 time,
    time3 datetime
);

# 时间需要用单引号括起来,不然会报错

insert into person values('2020-02-02','08:08:08','2020-02-02 08:08:08');

Released under the MIT License.