MySQL微讲解(二)
字符编码与配置文件
# 查看MySQL默认字符编码
查看MySQL默认字符编码的命令是:\s
1.如果是5.6、5.7系列,显示的编码有多种(latin1、gbk...)
2.如果是8.0系列,统一是utf8mb4,utf8mb4是utf8的优化版本,支持表情
# 统一字符编码
因为5.6、5.7系列的默认编码有多种,可能会导致乱码,所以应该统一编码:
1.找到my-default.ini配置文件
2.拷贝一份该配置文件,放到该路径下,并修改名称为my.ini
3.清空my.ini里面所有的内容
4.添加固定的配置信息:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
5.保存并重启服务端即可生效
存储引擎
# 1.什么是存储引擎
存储引擎可以理解为处理数据的不同方式
# 2.查看存储引擎
show engines;
# 3.需要理解的引擎
MyISAM:5.1之前版本MySQL默认的存储引擎,存储数据的速度快,但是功能很少,安全性较低
InnoDB:5.1之后版本的MySQL默认的存储引擎,有很多的功能,安全性较高,存取速度没有MyISAM快
BlackHole:任何写入的数据都会立刻消失,类似于垃圾回收处理站
Memory:已内存作为数据存取地,速度快但是断电立刻丢失
# 4.自定义选择存储引擎
create table t1(id int)engine=myisam;
create table t2(id int)engine=innodb;
create table t3(id int)engine=blackhole;
create table t4(id int)engine=memory;
创建表的完整语法
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
1.字段名和字段类型是必须的
2.数字和约束条件是可选的
3.约束条件可以写多个,空号隔开即可
4.最后一行字段结尾不能加逗号
字段类型
1.整型
类型 |
字节最小值(带符号) |
最大值(带符号) |
最小值(不带符号) |
最大值(不带符号) |
占据字节数 |
TINYINT |
-128 |
127 |
0 |
255 |
1bytes |
SMALLINT |
-32768 |
32767 |
0 |
65535 |
2bytes |
INT |
-2147483648 |
2147483647 |
0 |
4294967295 |
4bytes |
BIGINT |
-9223372036854775808 |
9223372036854775807 |
0 |
18446744073709551616 |
8bytes |
上述表格里的整型区别是从上往下能够存储的数字范围越来越大,需要注意的就是考虑正负数的关系,如果需要存储负数,则需要占据一个比特位,当用整型来存储手机号的时候,应该使用BIGINT才可以,INT是不够的。
# 超出最大范围的结果和解决措施
(1)5.6版本
在5.6版本超出最大范围了不会报错,会自动处理成最大范围,但是这样就没有意义了,我们可以修改一下,当超过最大范围就报错:
步骤一:输入命令:set global sql_mode = 'STRICT_TRANS_TABLES';
步骤二:退出服务端重新登陆即可
(2)5.7及以上版本
在5.7及以上版本超过最大范围就会直接报错,但是经过验证我们发现所有的整型都默认带有正负号,可以修改不带正负号的,也就是加约束条件'unsigned',例如:create table aaa(id tinyint unsigned);就可以修改为不带正负号的。
2.浮点型
类型 |
字节数 |
举例 |
描述 |
float |
4bytes |
float(255,30) |
总共255位,小数位占30位 |
double |
8bytes |
double(255,30) |
总共255位,小数位占30位 |
decimal |
M+2bytes |
decimal(65,30) |
总共65位,小数位占30位 |
上述表格里的浮点型从上往下精确度越来越高,decimal的精确度最高,double次之,float精确度最小,虽然三者有些差别,但是结合具体的业务实际情况,需要用的类型不同。
3.字符类型
char和varchar都是MySQL中的字符类型,区别在于一个是定长,一个变长
# char
是定长字符类型,后面可以加括号,括号里面的数字是多少,最大只能存储多少个字符,超出就会报错,不够就会用空格填充
例如:create table t10(name char(4));
# varchar
是变长字符类型,后面可以加括号,括号里面的数字是多少,最大只能存储多少个字符,超出就会报错,如果不够不会用空格填充,是多少就是多少
例如:create table t11(name varchar(4));
# 版本及解决
5.7及以上版本,超出最大存储就会报错,但是5.6版本不会,会直接截取最大字符的个数进行保存,这样是没有意义的,所以就要修改一下严格模式:
1.临时修改
步骤一:输入命令:set global sql_mode = 'STRICT_TRANS_TABLES';
步骤二:退出服务端重新登陆即可
2.永久修改
修改my.ini配置文件,添加sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY',然后重启服务端之后就会永久生效
# 获取字段数据长度
char_length();
该方法无法直接获取到定长的真是长度,因为MySQL在存数据的时候会自动填充空格,取数据的时候又会自动移除空格,我们可以修改让MySQL在取数据的时候不自动移除空格,命令是:set session sql_mode = 'pad_char_to_full_length'
# char、varchar的优缺点
1.char整存整取,速度快,但是会造成一定的空间浪费
2.varchar节省存储空间,存取数据的时候没有char快,因为在取数据的时候不知道数据的准确长度。所以varchar在存数据的时候会生成一个1bytes的报头,用于记录数据长度,varchar在取数据的时候会先读取1bytes的报头,从中获取真实的数据长度。
4.数字的含义
字段类型括号内的数字大部分都是用来限制存储长度的,但是整型中并不是用来限制长度的,而是用来控制展示长度的。
# zerofill
zerofill表示输出的位数不够的话用零补充
举例:create table t13(id int(3) zerofill);
insert into t13 values(1); # 001
insert into t13 values(1111); # 够的话有几位就展示几位
'''涉及到整型字段的我们是不需要自己定义长度的,使用自带的即可,而针对其他类型的子段,需要自己定义'''
5.枚举与集合
# 1.枚举
多选一,插入数据的时候针对已经提前定义好的数据,我们可以选一个,多选会报错,选择定义之外的也会报错。
create table a2(
id int,
gender enum('male','female')
);
insert into a2 values(1,'male');
select * from a2;
insert into a2 values(1,'other');
# 2.集合
多选多,插入数据的时候针对已经提前定义好的数据,我们可以选一个或者多个,中间用逗号隔开即可,选择定义之外的会报错。
create table a3(
id int,
hobby set('足球','篮球','排球','羽毛球')
);
insert into a3 values(211,'足球,篮球');
select * from a3;
6.日期类型
类型 |
描述 |
date |
年月日 |
datetime |
年月日时分秒 |
time |
时分秒 |
year |
年 |
create table a4(
id int,
name varchar(225),
reg_time datetime,
birth date,
student_time time,
join_time year);
insert into a4 values(1,'oscar','2022-02-23','2001-02-23','11:11:11','2022');
select * from a4;
约束条件
# 1.约束条件与字段类型的关系
约束条件是基于字段类型之上的额外限制,例如我们刚刚讲过的无需正负号'unsigned'和零填充'zerofill',都是约束条件
例子:id int unsigned
字段类型int规定了id字段只能是整数
约束条件unsigned规定了在整数的基础上必须是正数
# 2.非空
非空的意思就是好不允许为空
create table a5(
id int not null, # id字段不允许为空
name varchar(255));
insert into a5 values(1,'oscar');
insert into a5 values('jason'); # 报错
insert into a5 values(null,'jason'); # 报错
# 3.默认值
默认值'default',建表的时候设置默认值,如果用户不填就是用默认值,用户填写就是用用户填写的
create table a6(
id int,
name varchar(255) default 'oscar');
insert into a6(id) values(1); # 指定某个表的某个字段添加数据
insert into a6 values(2,'jason');
select * from a6;
# 4.唯一值
设置唯一值得约束条件是'unique'
1.单列唯一:某个字段下对应的数据不能重复
create table a7(
id int,
name varchar(255) unique);
insert into a7 values(1,'oscar');
insert into a7 values(2,'oscar'); # 报错
2.多列唯一:多个字段下对应的数据组合到一起的结果不能重复
create table a8(
id int,
name varchar(255),
age int,
unique(name,age)
);
insert into a8 values(1,'oscar',18);
insert into a8 values(1,'oscar',19);
insert into a8 values(1,'jason',19);
insert into a8 values(1,'oscar',19); # 报错
约束条件之主键
primary key就是主键
1.单从约束层面上而言,相当于not null + unique,表示非空且唯一
create table a9(id int primary key);
2.InnoDB存储引擎规定一张表必须有一个主键,用于构建表,主键可以加快数据的查询速度,类属于书的目录,如果创建表的时候没有设置主键,也没有其他的键,那么InnoDB会采用一个隐藏的字段作为表的主键,隐藏就意味着无法使用,即无法加快数据的查询,如果没有主键但是有非空且唯一的字段,那么会自动升级成主键,从上往下的第一个。
create table a9(
tid int,
pid int not null unique, # 顺位成为主键
cid int not null unique
);
3.也可以联合多个主键,就是多个字段组合,本质还是一个主键
create table a10(
id int,
name varchar(32),
pwd int,
primary key(id,pwd)
);
# 自增
'auto_increment'专门配合主键一起使用,用户以后再添加数据的时候就不需要自己记忆主键值了
create table a11(
id int primary key auto_increment,
name varchar(255)
);
'''在创建规范表的时候,一般都会有一个主键字段的编写,并且是自增的'''
这里是IT小白陆禄绯,欢迎各位大佬的指点!!!