前言时刻:今天的学习了 MySQL 的数据类型以及创建表,不得不说里面的坑真多,还好老师讲的细致,都搞明白了。
目录:
1、创建表
2、数据类型
2.1 字符串类型:
2.2 整数类型:
2.3 浮点数类型
2.4 浮点数类型
3、 修改表结构
总结:
写作环境:
MacOS、MySQL8.0
写SQL工具:Navicat15.0和电脑自带终端
写作软件:Typora
作者:西园公子 www.zwjjiaozhu.top
创建表的同时也是需要指定表的编码方式、排序规则和存储引擎。如果不指定这几项则默认是和数据库的这几项值
一样,例如,我们创建了一个数据库 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;
复制
MySQL 的数据类型超级重要,不然以后遇到插数据的问题,就会犹豫不定:我要插入多大的数据呀?数据库能放下吗?等等各种问题,但若是你搞懂了就有一种胸有成竹的感觉,随意增删改查。
注:指定长度的类型,如果插入的数据超过设置大小,则字符串会被截断,取前半部分。
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 个字节,如果不懂编码可看我之前写的文章搞懂编码问题。
假设表的编码方式是utf8 ,MySQL按照一个字符对应最大三个字节来算,减去存放字符数的最大值(三个字节),最终的字符数等于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; # ❌
复制
所有的整数类型都默认是有符号的,即有负数和正数,如果需要无符号,则在该关键字后面跟着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;
复制
其他的就不做演示了,都是一样的原理。复制
复制
注:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
使用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);
复制
以上命令均为本地测试成功后才写的,不是瞎写的。


总结


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