mysql数据库基本操作初阶(二)
数据库存储引擎
是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是插件式存储引擎。
- 如何查看数据库存储引擎
mysql> show engines;
图1 数据库存储引擎
mysql主要存储引擎
- innodb
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。
- myisam
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务,不支持外键。是MySQL5.5版本之前默认的存储引擎。
- memory
MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。断电数据丢失
- blackhole
无论存什么,都立刻消失(黑洞),黑洞存储引擎,可以应用于主备复制中的分发主库。
图2 存储引擎对比图
建表时候指定存储引擎
mysql> create table t1(id int, name varchar(16)) engine=innodb;
Query OK, 0 rows affected (0.02 sec)
mysql> create table t2(id int, name varchar(16)) engine=myisam;
Query OK, 0 rows affected (0.01 sec)
mysql> create table t3(id int, name varchar(16)) engine=memory;
Query OK, 0 rows affected (0.00 sec)
mysql> create table t4(id int, name varchar(16)) engine=blackhole;
Query OK, 0 rows affected (0.00 sec)
- 在配置文件中指定存储引擎
default-storage-engine=INNODB
[root@surpass ~]# cat /etc/my.cnf
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
socket=/var/lib/mysql/mysql.sock
[mysqld]
skip-name-resolve
#设置3306端口
port=3306
socket=/var/lib/mysql/mysql.sock
# 设置mysql的安装目录
basedir=/usr/local/mysql
# 设置mysql数据库的数据的存放目录
datadir=/usr/local/mysql/data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
[root@surpass ~]#
- 查看刚刚创建的4张表
[root@surpass day45]# ls
db.opt t1.frm t1.ibd t2.frm t2.MYD t2.MYI t3.frm t4.frm
innodb: 有表结构,存储数据
myisam:有表结构,存储数据,查询索引
后两者只有表结构
memory,在重启mysql或者重启机器后,表内数据清空
blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录
创建表的完整语法
create table t1(
id int(11) not Null,
name varchar(16),
gender enum("male","female"),
hobby set("dbj","hecha")
)
action:
"""
1 在同一张表中字段名不能重复
2 宽度和约束条件是可选的(可写可不写) 而字段名和字段类型是必须的
约束条件写的话 也支持写多个
字段名1 类型(宽度) 约束条件1 约束条件2...,
3 最后一行不能有逗号
"""
基本数据类型
- 整型
TINYINT SMALLINT MEDUIMINT INT BIGINT
作用:存储年龄、等级、id、号码等等
"""
TINYINT:默认情况下是有符号的
超出后只会存储可接受的最大值
无符号(8位):0~255
有符号(7位,还有一位标记正负):-127~128
mysql> create table t5(id tinyint);
mysql> insert into t5 values(-129),(258);
约束条件之无符号 unsigned
mysql> create table t6(id tinyint unsigned);
mysql> insert into t6 values(0),(254);
"""
# 默认情况下整型都是带符号的
"""
针对整型 括号内的宽度到底是干嘛的
特例:只有整型括号里面的数字不是表示限制位数
如果数字没有超出8位 那么默认用空格填充至8位
如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
# 用0填充至8位
mysql> create table t8(id int(8) zerofill);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t8 values(11);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t8;
+----------+
| id |
+----------+
| 00000011 |
+----------+
1 row in set (0.01 sec)
"""
严格模式
- 如何查看严格模式
mysql> show variables like "%mode";
模糊匹配/查询:
关键字 like
%:匹配任意多个字符
_:匹配任意单个字符
- 修改严格模式
set session 只在当前窗口有效
set global 全局有效
set global sql_mode = 'STRICT_TRANS_TABLES';
修改完之后 重新进入服务端即可
action
设置是替换
set global sql_mode ='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'
浮点型
float double decimal
- 存储限制
# 存储限制
float(255,30) # 总共255位 小数部分占30位
double(255,30) # 总共255位 小数部分占30位
decimal(65,30) # 总共65位 小数部分占30位
float < double < decima
# 要结合实际应用场景 三者都能使用
字符类型
"""
char(4) 定长 数据超过四个字符直接报错 不够四个字符空格补全
varchar(4) 变长 数据超过四个字符直接报错 不够有几个存几个
"""
"""
create table t18(name char(4));
create table t19(name varchar(4));
insert into t18 values('a');
insert into t19 values('a');
# 介绍一个小方法 char_length统计字段长度
select char_length(name) from t18;
select char_length(name) from t19;
"""
首先可以肯定的是 char硬盘上存的绝对是真正的数据 带有空格的
但是在显示的时候MySQL会自动将多余的空格剔除
"""
# 再次修改sql_mode 让MySQL不要做自动剔除操作
set global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
char和varchar
"""
char
缺点:浪费空间
优点:存取都很简单
直接按照固定的字符存取数据即可
jason egon alex wusir tank
存按照五个字符存 取也直接按照五个字符取
varchar
优点:节省空间
缺点:存取较为麻烦
1bytes+jason 1bytes+egon 1bytes+alex 1bytes+tank
存的时候需要制作报头
取的时候也需要先读取报头 之后才能读取真实数据
以前基本上都是用的char 其实现在用varchar的也挺多
"""
补充:
进来公司之后你完全不需要考虑字段类型和字段名
因为产品经理给你发的邮件上已经全部指明了
时间类型
- 分类
date:年月日 2020-5-4
datetime:年月日时分秒 2020-5-4 11:11:11
time:时分秒11:11:11
Year:2020
"""
create table student(
id int,
name varchar(16),
born_year year,
birth date,
study_time time,
reg_time datetime
);
insert into student values(1,'egon','1880','1880-11-11','11:11:11','2020-11-11 11:11:11');
"""
枚举和集合类型
- 分类
"""
枚举(enum) 多选一
集合(set) 多选多
"""
- 使用
create table user(
id int,
name char(16),
gender enum('male','female','others')
);
insert into user values(1,'jason','male'); 正常
insert into user values(2,'egon','xxxxooo'); 报错
# 枚举字段 后期在存数据的时候只能从枚举里面选择一个存储
create table teacher(
id int,
name char(16),
gender enum('male','female','others'),
hobby set('read','DBJ','hecha')
);
insert into teacher values(1,'jason','male','read'); 正常
insert into teacher values(2,'egon','female','DBJ,hecha'); 正常
insert into teacher values(3,'tank','others','生蚝'); 报错
# 集合可以只写一个 但是不能写没有列举的