暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL学习笔记03-创建表_数据类型_修改表结构

数据字节大爆炸 2021-08-10
461

前言时刻:今天的学习了 MySQL 的数据类型以及创建表,不得不说里面的坑真多,还好老师讲的细致,都搞明白了。

目录:

  • 1、创建表

  • 2、数据类型

    • 2.1 字符串类型:

    • 2.2 整数类型:

    • 2.3 浮点数类型

    • 2.4 浮点数类型

  • 3、 修改表结构

  • 总结:

写作环境:

MacOS、MySQL8.0

写SQL工具:Navicat15.0和电脑自带终端

写作软件:Typora

作者:西园公子 www.zwjjiaozhu.top


01
 创建表


创建表的同时也是需要指定表的编码方式排序规则存储引擎。如果不指定这几项则默认是和数据库的这几项值

一样例如,我们创建了一个数据库 a 并指定 utf8 编码和 utf8_bin 的排序规则,则创建的表 t 若不指定则默认是 utf8 和 utf8_bin 。关于引擎这一块,后面再补。

    CREATE TABLE t1 (`name` CHAR(10),age INT, hobby VARCHAR(10)
    ) CHARACTER SET UTF8 COLLATE utf8_bin ENGINE InnoDB;


    # 插入数据
    INSERT INTO t1 VALUES('zhang', 18, '看电影');
    SELECT * FROM t1;
    复制
    02
     MySQL数据类型


    MySQL 的数据类型超级重要,不然以后遇到插数据的问题,就会犹豫不定:我要插入多大的数据呀?数据库能放下吗?等等各种问题,但若是你搞懂了就有一种胸有成竹的感觉,随意增删改查。

    2.1
     字符串类型


    注:指定长度的类型,如果插入的数据超过设置大小,则字符串会被截断,取前半部分。

    1)可变长度和固定长度是什么意思?

    可变长度字面意思就是用多少存多少。举个例子,你家的网的带宽大小,如果最高 10MB/s,那么你的速度可以是1MB/s、2MB/s……只要不超过10MB/s就可以。

    固定长度假设规定存储范围是 4 个字节,即使只存进去一个字母(1个字节),数据库也是按照4个字节存放该字母,不足的补空格

    举个例子,假设这条带宽你是按月交钱,即使你每天都不用或者上网速度都是1~2MB/s的情况,那你到月底交钱的时候还是按照10MB 规格的宽带交钱,不会因为你平常不用就少交些钱的。

    看完下面这个表,你就明白了。

    注:VARCHAR(4)中存放'abcd'为什么需要 5 个字节,abcd 占用 4 个字节 + 存储字符数 1 个字节 = 5


    2)varchar 类型最大可以存放多少个字符?

    MySQL 规定的 VARCHAR 的单位是字符,所以需要将字节数转成字符数,另外默认需留出1-3个字节用于存放字符数。

    我们知道表有很多的编码方式如:utf8、gbk等,其中 utf8 是可变长的采用 1 到 6 个字节存放一个字符,我们的汉字是一个汉字对应 3 个字节,如果不懂编码可看我之前写的文章搞懂编码问题

    假设表的编码方式是utf8MySQL按照一个字符对应最大三个字节来算减去存放字符数的最大值(三个字节),最终的字符数等于num = (65535-3)/3=21844。

    所以你在设置 VARCHAR(num) 的时候,num 最大是21844。如果是gbk方式,则是按最大两个字节对应一个字符的规则,得出num = (65535-3)/2=32766。


    3)关于 CHAR 类型的补充:

    CHAR类型的范围默认就是以字符为单位,0~255个字符范围,所以超过255就会报错。

      # 2.1 char类型,0到255个字符
      create table t2 (`name` CHAR(255)) CHARACTER SET utf8; # ✅
      create table t2 (`name` CHAR(256)) CHARACTER SET utf8; # ❌
      复制
      2.2
       整数类型

      所有的整数类型都默认是有符号的,即有负数和正数,如果需要无符号,则在该关键字后面跟着unsigned即可。


        CREATE TABLE t5 (`name` VARCHAR(10), age INT, job VARCHAR(20)) CHARACTER SET utf8 COLLATE utf8_bin;


        # 测试1
        # 修改 age的属性为tinyint类型(1个字节)
        ALTER TABLE t5 MODIFY age TINYINT;
        # 插入数据
        INSERT INTO t5 (age, job) VALUES(127, '写文章'); # ✅
        INSERT INTO t5 (age, job) VALUES(128, '写文章'); # ❌


        # 无符号 int 类型
        CREATE TABLE t6 ( age INT UNSIGNED) CHARACTER SET utf8 COLLATE utf8_bin;
        复制
        其他的就不做演示了,都是一样的原理。
        复制

        复制
        2.3
         浮点数类型


        注:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。

        2.4
        浮点数类型



        03
        修改表结构

        使用DESC table_name;命令,可展示出表的内部结构,后面修改完表结构后可以用此命令查看表结构。

          DESC `table_name`;   # 使用desc展示表的结构
          # 结果
          mysql> DESC t5;
          +-------+-------------+------+-----+---------+-------+
          | Field | Type | Null | Key | Default | Extra |
          +-------+-------------+------+-----+---------+-------+
          | name | varchar(10) | YES | | NULL | |
          | age | int | YES | | NULL | |
          | hobby | varchar(30) | YES | | 干饭 | |
          +-------+-------------+------+-----+---------+-------+
          复制

          1)修改表名:

          rename table t1 to t2;

            RENAME TABLE `table_name` TO table_new_name;
            复制

            2)追加列:

            使用 add 命令

              # 2.1 追加列
              ALTER TABLE `table_name` ADD (hobby VARCHAR(30) DEFAULT '干饭');
              复制


              3)修改列属性:

              使用 modify 命令

                ALTER TABLE `table_name` MODIFY job VARCHAR(15);
                复制


                4)删除列:

                使用 drop 命令

                  # 2.3 删除列
                  ALTER TABLE `table_name` DROP hobby;
                  复制

                  可以一次性删除多个列,用逗号分隔,组合不同的命令。同理也可以一次性添加多个列等,

                    ALTER TABLE `table_name` DROP hobby, DROP job;
                    复制

                    5)修改列名:

                    使用 change 命令,替换后的列名同时也可设定新的的参数。

                      ALTER TABLE t5 CHANGE `column_name` `column_name2`;
                      ALTER TABLE t5 CHANGE `column_name` `column_name2` VARCHAR(30);
                      复制

                      上命令均为本地测试成功后才写的,不是瞎写的。


                      总结



                      内容很多,多练几遍就好,重点是varcharchar的存储范围问题。好了今天就到这了,下一篇将写插入数据相关的操作,觉得有帮助的话,别忘了一键三连哈。

                      文章转载自数据字节大爆炸,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论