美文网首页
06-MySQL数据类型

06-MySQL数据类型

作者: 喝酸奶要舔盖__ | 来源:发表于2019-01-06 10:24 被阅读0次

    整型

    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 233 372 036 854 775 808,9 223 372 036 854 775 807)  (0,18 446 744 073 709 551 615)  极大整数值
    
    注意点:
    - 和编程开发中的整型一样, 也区分有符号的整型和无符号的整型 unsigned, 默认就是有符号, 如果是无符号, 那么取值范围*2
    - 在企业开发中也和编程开发中, 每一个字段最好使用合适的类型
        + 例如存储人的年龄, 就不要使用INT,
    - 通过desc看到的数据类型后面的数值并不是占用的存储空间大小, 而是二printf一样,是位宽
        + 例如:  tinyint(4) 显示的宽度是4
        + 默认宽度不会自动填充, 如果想自动填充, 必须加上zerofill
    - 如果存储的值超出了取值范围, 那么会报错
    
    示例一:
    create table if not exists stu1(
        id int auto_increment primary key,
        score TINYINT
    );
    insert into stu1 values(null, 127); #不会报错
    insert into stu1 values(null, 128); #会报错
    
    示例二:
    create table if not exists stu2(
        id int auto_increment primary key,
        score TINYINT unsigned
    );
    insert into stu2 values(null, 128); #不会报错
    insert into stu2 values(null, 255); #不会报错
    insert into stu2 values(null, 256); #不会报错
    
    示例三:
    create table if not exists stu3(
        id int auto_increment primary key,
        score TINYINT
    );
    insert into stu3 values(null, 1);
    
    create table if not exists stu4(
        id int auto_increment primary key,
        score TINYINT(2) ZEROFILL
    );
    insert into stu4 values(null, 1);
    insert into stu4 values(null, 12);
    insert into stu4 values(null, 123);
    

    浮点类型

    • FLOAT(m, d) 4 字节 单精度
    • DOUBLE(m, d) 8 字节 双精度
    • m总位数, d小数位数
    float和double的区别
        + 和编程开发中一样, 默认保留的小数位数不同
        + 和编程开发中一样, 有效精度也不同
        + 和编程开发中一样, 浮点类型是不准确的
        + 所以在企业开发中千万不要使用浮点数来保存用户的准确(珍贵)信息(RMB)
    
    示例一:
    create table if not exists stu5(
        id int auto_increment primary key,
        score FLOAT,
        height DOUBLE
    );
    insert into stu5 values(null, 1.12345678901234567890, 1.12345678901234567890);
    
    示例二:
    create table if not exists stu6(
        id int auto_increment primary key,
        score FLOAT(3,2),
        height DOUBLE(3,2)
    );
    insert into stu6 values(null, 1.12345678901234567890, 1.12345678901234567890);
    
    示例三: 丢失精度
    create table if not exists stu7(
        id int auto_increment primary key,
        score FLOAT(20,19),
        height DOUBLE(20,19)
    );
    insert into stu7 values(null, 1.12345678901234567890, 1.12345678901234567890);
    

    定点类型

    • decimal(M, D), m总位数, d小数位数
    • 定点类型的本质:
      是将数据分为两个部分来存储, 每个部分都是整数, 所以定点数不要滥用, 因为非常消耗资源
    示例三: 丢失精度
    create table if not exists stu8(
        id int auto_increment primary key,
        score decimal(30,29),
        height decimal(30,29)
    );
    insert into stu8 values(null, 1.12345678901234567890666, 1.12345678901234567890666);
    
    +----+---------------------------------+---------------------------------+
    | id | score                           | height                          |
    +----+---------------------------------+---------------------------------+
    |  1 | 1.12345678901234567890666000000 | 1.12345678901234567890666000000 |
    +----+---------------------------------+---------------------------------+
    

    字符类型

    • CHAR(size) 0-255字节 定长字符串
    • VARCHAR(size) 0-65535 字节 变长字符串

    注意点: 由于是字符类型, 所以传递值只能用单引号''

    char(2) 和 varchar(2)的区别:
    - 它们最多都只能保存2个字符
    - char(2)不会回收多余的字符, 指定多少个就给我们多少个
    - varchar(2)会回收多余的字符, 用多少给多少
    - 由于char(2)不会回收多余的字符, 所以效率高
    - 由于varchar(2)会回收多余的字符, 所以效率相对低一些
    
    示例一:
    create table if not exists stu9(
        id int auto_increment primary key,
        name1 char(2),
        name2 varchar(2)
    );
    insert into stu9 values(null, 'ab', 'de');
    insert into stu9 values(null, '1', '2');
    insert into stu9 values(null, '123', '234'); #超出范围就会报错
    
    示例二:
    如果没有指定长度, 那么默认char就是255,varchar65535
    create table if not exists stu10(
        id int auto_increment primary key,
        name char(255)
    );
    
    注意点: 理论上varchar最多能够存储65535个字符, 但是实际的大小和表的编码方式有关
    create table if not exists stu11(
        id int auto_increment primary key,
        name varchar(65535)
    )charset=gbk;
    如果表的编码方式是UTF-8, 那么最多能够存储65535/3
     Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead
     如果表的编码方式是GBK, 那么最多能够存储65535/2
     Column length too big for column 'name' (max = 32767); use BLOB or TEXT instead
    -->
    <!--
     5.MySQL中每一行数据的大小限制
     注意点: 在MySQL中每一行数据最多只能存储65535个字节
    create table if not exists stu12(
        cls char(2),
        name varchar(32767) #会报错, 所有列的总大小超过了65535
    )charset=gbk;
    
    create table if not exists stu12(
        cls char(2),
        name varchar(32764) #只要所有列的中大小不超过65535就可以创建
    )charset=gbk;
    

    大文本类型

     TINYTEXT   0-255字节 短文本字符串
     TEXT       0-65535字节   长文本数据
     MEDIUMTEXT 0-16777215字节    中等长度文本数据
     LONGTEXT   0-4294967295字节  极大文本数据
    

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


    枚举类型

    • 和编程开发中一样, 如果某个字段只能是固定的几个取值,并且只能是其中一个取值, 那么就可以使用枚举
    • 和编程开发中一样, MySQL中的枚举类型本质也是整型, 但是是从1开始的
    • 和编程开发中一样, 既然本质是整型, 所以就可以设置整型数据
    create table if not exists stu14(
        cls char(2),
        gender enum('男', '女', '妖')
    );
    insert into stu14 values(null, '未知'); #会报错, 只能设置枚举中列举的值
    insert into stu14 values(null, '男');
    insert into stu14 values(null, '女');
    
    
    select gender+0 from stu14;
    insert into stu14 values(null, 1); #插入整型, 但是也必须在范围内
    

    集合类型

    • 和编程开发中一样, 如果某个字段只能是固定的几个取值,并且可以是其中某几个取值, 那么就可以使用集合类型
    create table if not exists stu15(
        cls char(2),
        hobby set('篮球', '足球', '棒球', '足浴')
    );
    insert into stu15 values(null, '高尔夫'); #会报错, 只能设置集合中列举的值
    insert into stu15 values(null, '足球'); #插入一个值
    insert into stu15 values(null, '足球,篮球'); #插入多个值
    
    注意点: MySQL中的集合本质也是整型
    insert into stu15 values(null, '篮球'); #1
    insert into stu15 values(null, '足球'); #2
    insert into stu15 values(null, '棒球'); #4
    insert into stu15 values(null, '篮球,足球,棒球'); #7
    
    select hobby+0 from stu15;
    
    底层的计算公式是2(n), n从0开始
    2(0) === 1;
    2(1) === 2;
    2(2) === 4;
    
    1 === 0001
    2 === 0010
    4 === 0100
    -----------
          0111
    

    日期类型

    • 日期类型分三种
    DATE        3字节 YYYY-MM-DD  日期值
    TIME        3字节 HH:MM:SS    时间值或持续时间
    DATETIME    8字节 YYYY-MM-DD HH:MM:SS 混合日期和时间值
    
    create table if not exists stu16(
        id int auto_increment primary key,
        field1 date,
        field2 time,
        field3 datetime
    );
    insert into stu16 (field1) values ('2020-12-12');
    insert into stu16 (field1) values ('2020/12/12');
    insert into stu16 (field1) values ('202/12/12'); #内部会自动补全
    
    insert into stu16 (field2) values ('18:32:15');
    
    insert into stu16 (field3) values ('2020/12/12 18:32:15');
    

    布尔类型

    • MySQL不支持真正的布尔类型, 由于MySQL是用C/C++编写的, 所以非零即真,和C语言一样, ture===1 , false===0
    • 不会显示ture或者false,只会显示1或者0
    create table if not exists stu17(
        id int auto_increment primary key,
        field1 boolean,
        field2 boolean
    );
    insert into stu17 values (null, true, false);
    

    相关文章

      网友评论

          本文标题:06-MySQL数据类型

          本文链接:https://www.haomeiwen.com/subject/tkarrqtx.html