MySQL的存储
字符编码与配置文件
1.\s # 查看数据库基本信息(用户、字符编码)
2.my-default.ini # windows下MySQL默认的配置文件
拷贝上述文件并重命名为my.ini
3.添加字符编码相关的配置(直接百度搜索)
[mysqld] # 将MySQL服务端的编码改为utf8
character-set-server=utf8
collation-server=utf8_general_ci
[client] # 将MySQL的其他连接的客户端改为utf8
default-character-set=utf8
[mysql] # 将MySQL自己的客户端改为utf8
default-character-set=utf8
'如果配置文件涉及到mysqld相关的配置修改,那么需要重启服务端才可以生效'
4.可以在mysql下提前写好用户名和密码,之后就可以直接登录
存储引擎
'可以简单理解为对不同的数据采取不同的存储策略'
1.show engines; # 查看所有的存储引擎
'MySQL中默认是大小写不敏感的(忽略大小写)'
# 需要掌握的存储引擎
2.MyISAM
存取数据的速度快,但功能少,安全性较低(MySQL5.5和之前的默认的存储引擎)
3.InnoDB
存取数据的速度没有MyISAM快,但可以支持事务、行锁、外键等诸多功能,安全性较高(MySQL5.5之后版本默认的存储引擎)
4.Memory
基于内存的存储引擎,存取数据速度极快,但是断电数据会丢失
5.BlackHole
黑洞,任何写进去的数据都会立刻丢失,类似于实践站
'进入库 use 库名;'
6.不同储存引擎之间底层文件的区别
create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
'windows cmd终端鼠标右键的意思就是粘贴'
6.1innodb
t1.frm 表结构
t1.ibd 表结构、表索引(加快数据查询)
# 表结构和表索引合到一起,安全性较高
6.2myisam
t2.frm 表结构
t2.MYD 表数据
t2.MYI 表索引(加快数据查询)
# 表数据与表索引分开,存取速度快
6.3memory
t3.frm 表结构
# 存到内存,不需要表结构和表索引
6.4blackhole
t4.frm 表结构
# 获取数据就丢失,不需要表结构和表索引
MySQL的字段语法
创建表的完整语法
create table 表名(字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件)engine=储存引擎;
1.字段名和字段类型是必须的(至少写一个)
2.数字跟约束条件是可选的(可有可无)
3.约束条件可以写多个用空格符隔开即可
4.最后一个字段的结尾不呢加逗号
字段类型之整型
1.MySQL的整型
tinyint 1bytes
smallint 2bytes
int 4bytes
bigint 8bytes
2.验证整型是否自带负号
create table t1(id tinyint);
insert into t1 values(-129),(256); # -128,127
# 数据自动变为边界值存储,数据失真,没有实际意义
3.自定义移除负号
'unsigned 约束条件之一,意思是不需要负号'
create table t1(id tinyint unsigned);
insert into t1 values(-129),(256); # 0,255
'插入数据值超出类型范围,应该报错,而不是自动修改,让数据失真(这个功能其实是有的,只是被改了>>>配置文件)'
4.超出类型范围报错
4.1命令临时修改
set session sql_mode='strict_trans_tables' 当前客户端操作界面有效
set global sql_mode='STRICT_TRANS_TABLES' 服务端不重启永久有效
4.2配置文件永久修改
[mysqld]
sql_mode='STRICT_TRANS_TABLES'
字段类型之浮点型
1.MySQL的浮点型
float
double
decimal
3.浮点型储存方法的精准度不一样
create table t1(id float(255,30));
create table t2(id double(255,30));
create table t3(id decimal(65,30));
insert into t8 values(1.11111111111111111111111111111);
insert into t9 values(1.11111111111111111111111111111);
insert into t10 values(1.11111111111111111111111111111);
float < double < decimal
'一般情况下float足够,但如果想要更高的精度,可以使用字符串来代替'
字段类型之字符类型
1.定长char
char(4)最大只能储存四个字符,如果超过范围则直接报错,如果不够四个字符,则用空格填充至四个字符
2.变长varchar
varchar(4)最大只能储存四个字符,如果超过范围则直接报错,如果不够四个字符,则有多少存多少
3.验证两者的区别
create table t1(id int, name char(4));
create table t2(id int, name varchar(4));
3.1验证结果,超出范围都会报错
3.2验证定长与变长的特性
char_length() # 统计字段数据的长度
'''
char在储存时对于有空缺位置的字符会自动填充空格,然后在读取的时候再将自动填充的空格移除,如果想取消该机制,需要使用sql_mode
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
上面写的方法是替换,不是新增,所以之前的配置也要写上
'''
4.char与varchar
4.1char
整存整取,速度较快,但浪费存储空间
4.2varchar
节省内存空间,存取数据的速度慢于char
'''
char(4)
a barr yint
varchar(4)
a+barry+int
varchar存取数据需要操作报头,耗时更长
两者使用频率都很高,现在默认很多时候是varchar
'''
数字的含义
数字大部分情况下都是用来限制字段的存储长度,但是整型除外,整型是用来展示长度
create table t1(id int(3));
# 默认最少展示三位,如果超出,则有几位展示几位,如果不足,则用空格填充
create table t2(id int(3) zerofill); # zerofill不足用0填充
# 默认最少展示三位,如果超出,则有几位展示几位,如果不足,则用0填充
'''
以后涉及到整型字段的定义,类型后面不需要加括号写数字,除非有业务要求
eg:
0000123
0012123
'''
字段类型之枚举与集合
'desc 表名; 看表结构'
1.枚举
只能从规定的选择里选一个
create table t1(id int,
name varchar(32),
gender enum('male','female','others'));
2.集合
只能从规定的选择里选多个(包括一个)
create table t2(id int,
name varchar(32),
hobbies set('read','run','music','rap'));
字段类型之日期类型
date 年月日
datetime 年月日时分秒
time 时分秒
year 年份
create table t1(id int,
name varchar(32),
birth date,
reg_time datetime,
study_time time,
join_time year);
insert into t1 values(1,'barry','2022-8-15','2022-8-15 19:07:00',
'19:07:00','1995')
字段约束条件
'''
insert into 表名 vlaues() # 默认按照创建表的字段顺序添加
insert into 表名(字段) vlaues() # 可以自定义字段顺序
'''
1.unsigned(无负号) 没有负号
id int unsigned
2.zerofill(零填充) 用0填充
id int zerofill
3.not null(非空) 必须传值
name varchar(32) not null
4.default(默认值) 若没有传值则输入默认值
name varchar(32) default 'barry'
5.unique(唯一值) 让一些数据不能重复
id int unique