MySQL微讲解(二)

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小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-05-04 22:47  陆禄绯  阅读(27)  评论(0编辑  收藏  举报