本文摘自PHP中文网,作者coldplay.xixi,侵删。

免费学习推荐:mysql视频教程
目录
- 库相关内容
- 表的详细操作
- 数据类型
- 枚举与集合
- 存储引擎(了解即可)
库相关内容
MySQL一些默认库
information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等
performance_schema: MySQL 5.5开始新增一个数据库:主要用于收集数据库服务器性能参数,记录处理查询请求时发生的各种事件、锁等现象
mysql: 授权库,主要存储系统用户的权限信息
test: MySQL数据库系统自动创建的测试数据库
ps:部分MySQL可能没有test库,如笔者的8.0,用于sys代替了test库
创建数据库就不用说了(在上一篇有提到),了解一下创建数据库时的命名规则:
可以由字母、数字、下划线、@、#、$
区分大小写
唯一性
不能使用关键字如 create select
不能单独使用数字
最长128位
通常命名都是字母、数字、下划线、例如上面的@#$
建议不要使用,后续我们如果通过代码连接库,里面的符号有可能会与代码的语法冲突。
表的详细操作
创建表的约束条件(详细留到下一章讲解)
1 2 3 |
|
上面操作表示,约束了student这个表的id 和 name字段插入值时,不能为空
1 |
|
产生报错:ERROR 1048 (23000): Column ‘id’ cannot be null
告诉我们id不能为空
更改表的补充操作
约束条件是可有可无的,根据自身对表的需求。
修改表名
1 |
|
增加字段
1 |
|
删除字段
1 |
|
修改字段
1 |
|
复制表
当我们通过select查询表的时候,呈现给我们的是一张:虚拟表,即存在内存中的内容,不能够保存下来,我们通过复制,可以拿到我们想要的表数据
创建一张表演示
1 |
|
我们需要将id大于2记录的内容保存到一张新的表
1 |
|
或者我们只是想复制表的数据结构,除了记录(数据)以外,其它所有信息
1 |
|
这种判断永远为假,表示无法复制表的记录,但是可以复制它的数据结构
数据类型
1、整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存储年龄,等级,id,各种号码等
不同的整数类型,存储的数值范围不同。
比如:当我们选择int类型创建一个字段后,这张表就会多占用4个字节。我们需要根据自己存入值的范围来选择整数类型,可以节省空间。
2、浮点类型:float、double、decimal(可以写成dec)
作用:存储薪资、身高、体重、体质参数等
float(255,30) :整数可以支持到255个数字个数,并且支持30位以内的小数
double(255,30) :整数可以支持到255范围内,并且支持30位以内的小数
dec(65,30) :整数可以支持到60范围内,并且支持30位以内的小数
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
那么这三个浮点类型的区别在于哪里?答案是:精准度
实例:创建3张不同浮点类型的表
1 |
|
插入值
1 |
|
效果
decaimal能够存储精确值的原因在于其内部按照字符串存储。
通常我们使用float就足够了,要求再高一点使用double就可以了,如果对精准度要求特别高那么就使用decaimal,但是decaimal整数长度不如float与double
3、日期类型:DATE TIME DATETIME TIMESTAMP YEAR
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
在我们创建表字段时,可以指定某个字段传入的日期是什么,以下可选:
1 |
|
实例:创建表
1 2 3 4 5 6 7 |
|
插入记录
1 2 3 4 5 6 7 |
|
MySQL提供的两种日期时间都可以提供给我们使用,那它们之间的区别在哪里呢
datetime与timestamp的区别
首先占用空间:datetime占用8字节大小,timestamp占用4字节大小
在5.x以上版本,改动表后使用timestamp可以自动给我们填上当前系统时间,笔者的8.0不能自动填上系统时间,和datietime呈现的效果一样了,只是上限的时间不同。我们如果要达到这个效果,可以创建时补充如下参数
1 2 3 4 |
|
我们添加数据时,可以根据前两个来字段添加,最后一个让它自动补充。
1 |
|
4、字符串类型:char、varchar
char:简单粗暴,浪费空间,存取速度快
字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
存储char类型的值时,会往右填充空格来满足长度
- 例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = ‘PAD_CHAR_TO_FULL_LENGTH’;)
varchar类型:变长,精准,节省空间,存取速度慢
- 字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节。
- varchar类型存储数据的真实内容,不会用空格填充,如果’ab ',尾部的空格也会被存起来
- 强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
- 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
- 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
- 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
char(4) | Storage Required | varchar(4) | Storage Required |
---|---|---|---|
’ ’ | 4字节 | ‘’ | 1字节 |
'ab ’ | 4字节 | ‘ab’ | 2字节 |
‘abcd’ | 4字节 | ‘abcd’ | 5字节 |
‘abcdef’ | 报错 | ‘abcde’ | 报错 |
区分介绍:
char类型定长,不管存多少数据,如果未达到指定长度,则空格补充
varchar类型变长:因为取的时候,不知道varchar类型取了多少个数据,所以默认会在开头放入1个字节的头部。(底层存储机制,只要我们自身输入的内容没有超过定义的长度就不会报错)
char一定比varchar更浪费空间?
如果存储内容相同长度的情况下,varchar占用大小会大于char
但是我们平常还是常使用varchar,因为我们存储内容时,无法确定内容的大小,所以通常使用varchar,也就多占那么1-2个字节,而char的话,则占用更多的大小。
注意:
如果存储的内容是网页或网络上的某一篇文章,建议不要把文字全部保存到数据库,直接将链接放上去保存即可。
严格模式下的MySQL,如果存储内容超过了字符串类型定义的长度,那么则会报错,而非严格模式下的MySQL,则是不保存超出的内容,并发出警告信息。
查看字符的个数
1 |
|
很奇怪的就是,char类型并没有占用10个字节,是因为MySQL帮我们隐藏了,只呈现给我们自身存储的内容,调整一下就可以让它显出原形。
1 |
|
查询时候的问题
很明显,这两个类型虽然内容一样,但是char占用字符更长
枚举与集合
通过enum函数与set函数,在创建表时,定义某个字段在插入值时,值的内容是否匹配。
1 2 3 4 5 |
|
enum:在向gender这个字段插入值时,只能输入其中一的值
set:在向hobbies这个字段插入值时,可以输入其中多个值,通过逗号隔开
1 |
|
如果我们输入的内容,与函数内定义的不符,非严格模式发出警告信息,严格模式直接报错
笔者的MySQL为严格模式(利于开发)
1 |
|
存储引擎(了解即可)
首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念。
数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。
1 |
|
但是我们创建表时并没有指定存储引擎呐。
因为MySQL默认的是:InnoDB
查询表的存储引擎
1 |
|
从上至下查看:
图片来源:秋月
MySQL架构总共四层,在上图中以虚线作为划分。
1、首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。
2、第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数)。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
3、第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。
4、第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬盘上。
MySQL存储引擎介绍:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
使用指定的存储引擎,两种方式:
1、创建表时指定
1 |
|
2、修改MySQL配置文件
1 |
|
测试部分存储引擎的效果,创建几张表不同存储引擎的表
1 |
|
注意:笔者安装的MySQL版本在8.0以上
进入MySQL下面data找到对应库下面,查看创建后的表文件类型
1.db.opt文件:用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。
2.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息
3.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息;
4.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息;
5.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息;
6.ibdata1文件:主要作用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。
从上面可以看出,.ibd储存的是数据信息和索引信息,ibdata1文件也是存储数据信息和索引信息,.MYD和.MYI也是分别储存数据信息和索引信息,那他们之间有什么区别呢?
主要区别是再于数据库的存储引擎不一样,如果储存引擎采用的是MyISAM,则生成的数据文件为表名.frm、表名.MYD、表名的MYI;而储存引擎如果是innoDB,开启了innodb_file_per_table=1,也就是采用独立储存的模式,生成的文件是表名.frm、表名.ibd,如果采用共存储模式的,数据信息和索引信息都存储在ibdata1(在里面进行分类,从外面看是一个文件)中;
在进行数据恢复的时候,如果用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去即可。但是如果是innodb的话,则每一个数据表都是一个单独的文件,只将相应的.frm和.ibd文件拷贝过去是不够的,必须在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。
演示向不同存储引擎的表插入数据
1 |
|
t1:innodb、t2:myisam、t3:memory、t4:blackhole存储引擎
t3的数据是存储在内存中的,t4写入的数据会被丢到,因为是黑洞引擎
我们通过select都能查询到内容,t4怎么查询都是空的,而t3在我们重启MySQL服务后,内容就会被清空,因为它是存入内存中的,重启等于释放掉整个MySQL服务再开启,
相关免费学习推荐:mysql数据库(视频)
以上就是一起了解什么是MySQL数据库的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
如何在linux下修改mysql数据库密码?linux修改数据库密码的方法
更多相关阅读请进入《mysql数据库》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。