MySQL学习(1)[参考书籍:mysql是怎么运行的]
目录
一、mysql设计模式和技术
二、mysql服务器和客户端
启动mysql服务
启动mysql客户端程序
三、mysql存储引擎
四、mysql配置
五、mysql系统变量
六、mysql字符集
编码和解码:
常见字符集(五种):
相关概念:
mysql字符集要点:
mysql字符集(客户端和服务端):
一、mysql设计模式和技术
### 1. 设计模式:采用c/s设计模式,客户端通过用户的输入来和服务器进行通信交互,服务器则负责处理请求、解析、运算、存储和返回响应结果给客户端。### 2. 所涉及的技术:TCP/IP技术:由c/s模式决定的;进程通信技术:像命名管道和共享内存(windows)、UNIX于套接字(类UNIX),因为服务器程序和客户端程序启动后实际上是两个进程
二、mysql服务器和客户端
启动mysql服务
### 1.导入:
即启动mysql服务器程序,通过服务器文件(大部分在安装的bin目录下)来启动,下面我们根据不同系统来了解认识
### 2.类UNIX系统:
mysqld:启动一个mysql服务器进程
mysqld_safe:间接调用mysqld,监控错误并重启服务,错误日志写入
mysql.server:间接调用mysqld_safe,相关命令为mysql.server start/stop
mysqld_multi:多个进程服务
### 3.windows系统:
## 2.1 mysqld.exe:
同类UNIX的mysqld,mysqld --console(启动将错误日志输入到cmd控制台)
## 2.2 注册为服务来启动:
注册服务语句:"完整的可执行文件路径" --install [-manual] [服务名称]
描述:其中-manual选项表示手动,不添加该选项则开机自启,服务名称默认为MySQL
示例语句:"C:\Program files\MySQL\MySQL Server 5.7\bin\mysqld" --install
net命令操作控制服务:net start/stop MySQL(MySQL是服务名)
启动mysql客户端程序
### 1. mysql客户端程序:
mysql、mysqladmin、mysqldump、mysqlcheck等### 2. 启动客户端连接服务器:
mysql -uroot -p密码(显式,不安全)
mysql -uroot -p(密式)
### 3. 了解连接服务器的参数(短形式/长形式)
-u/--user=用户名:用户参数
-p/--password=端口号:密码参数
-h/--host=主机名:IP或域名参数
示例:mysql -uroot -p 或者 mysql --user=root -p
三、mysql存储引擎
### 1.存储引擎
有很多,只需了解InnoDB和MyISAM即可,查看语句show engines;
### 2.版本变化
MySQL>=5.5.5:InnoDB
MySQL<5.5.5:MyISAM
可以看出现在主要使用InnoDB
### 3.InnoDB和MyISAM的定位
InnoDB:支持事务、行级锁、外键
MyISAM:主要的非事务处理存储引擎
### 4.相关语句
## 指定表的存储引擎
create table 表名(...
)engine=引擎名称
alter table 表名 engine=引擎名称
## 查看表的结构(含存储引擎)
show create table 表名\G
四、mysql配置
### 1.配置方式
mysql的配置可以通过【启动项】和【配置文件】来实现。
启动项:通过命令行指定选项,仅对当次启动生效(没有保存到硬盘),即重启失效;
配置文件:把选项写入配置文件,在每次启动时都会被读取应用;
### 2.命令行配置启动项(选项)规范
格式:命令 --启动项1=[值1] --启动项2=[值2]
示例:mysqld --skip-networking(禁止TCP/IP网络通信)
## 选项名称规范
--skip-networking就是启动项名称(选项名称),选项名称由多个单词构成,中间可以使用“-”或“_”(短划线或下划线)连接,即也可以写为--skip_networking
## 选项值规范
不是所有的选项都是有值的如上例命令,如果有值比如【--选项名=选项值】,反则省略含等号以后内容
## 衔接规范
选项(无论是短形式还是长形式)都要满足选项名后紧跟选项值,示例:mysql -u root -p
使用长形式即【--选项名=选项值】中间不能有任何空格
### 3.查看程序启动项
mysql --help
mysqld_safe --help
mysqld --verbose --help(特殊)
### 4.选项常用的长形式-短形式
--user -u
--password -p
--port -P
--host -H
--version -V
### 5.配置文件的读取顺序
## windows
%WINDIR%\my.ini,%WINDIR%\my.cnf【这个%WINDIR%就是一个系统变量,我们可以查看一下:echo %WINDIR%】
C:\my.ini,C:\my.cnf
BASEDIR\my.ini,BASEDIR\my.cnf 【BASEDIR是你MySQL的安装路径】
defaults-extra-file 【这个用于命令行指定配置文件,例如:mysqld --defaults-extra-file=C:\my.txt】
%APPDATA%\MySQL\.mylogin.cnf 【仅限客户端】
上面这些路径会由上到下依次读取,所以越靠后权重越大,以靠后配置为准(覆盖式)
## 类NUIX
/etc/my.cnf
/etc/mysql/my.cnf
SYSCONFDIR/my.cnf
$MYSQL_HOME/my.cnf 【仅限服务器】
default-extra-file 【命令行指定配置文件】
~/.my.cnf 【登录用户独有】
~/.mylogin.cnf 【仅限客户端】
上面这些路径会由上到下依次读取,所以越靠后权重越大,以靠后配置为准(覆盖式)
### 6.配置文件配置启动项规范
## 格式
[组名]
选项名称
选项名称=选项值
## 选项名称规范
不能用缩写(短形式),不允许加“--”(双短划线)
## 衔接规范
【选项名称=选项值】中间可以有空格,每行只能写一个选项
## 注释
行首使用"#"来进行注释
### 7.配置文件选项组
即前面规范格式所展示的就是一个选项组格式
[mysqld]:应用于服务器的配置项
[mysql]:应用于客户端的配置项
[server]:应用于服务器的配置项
[client]:应用于客户端的配置项
如果选项组里面出现了相同的选项,则以后面出现的选项配置为准
### 8.指定搜索配置文件
mysqld --default-file=文件路径
与--default-extra-file不同的是只搜索给定路径的配置文件
### 9.命令行启动项和配置文件的区别
(1) 有些针对于命令行应用的配置项是配置文件没有的;
(2) 命令行方式是临时作用的,而配置文件方式是持久作用的;
(3) 命令行会覆盖与之相同的配置文件选项,当然是临时作用的;
五、mysql系统变量
### 1. 导入:
了解mysql的系统变量,我们可以熟悉当前版本的默认功能行为
### 2.查看系统变量:
show variables [like 匹配模式]
## 3.系统变量分类
按作用域分:全局、会话(部分)
按时效分:临时【命令行】、持久【配置文件】
### 4.设置系统变量
(1)通过启动项设置:命令行方式、配置文件方式
(2)服务器运行过程中命令设置:set [global|session] 系统变量名=值; 【作用域默认为session】
### 5.系统变量规范
虽然我们通过启动项设置系统变量时,多个单词的变量名可以用“-”或“_”连接,
但是他们在内部都会转换成“_”连接的形式,所以我们查看时要用“_”连接的系统变量名。
示例:show variables like 'max_connections';【设置时可以mysqld --max-connects=10】
### 6.系统变量和启动项
(1) 有些系统变量是运行过程中生成的,不能通过启动项来设置,如:character_set_client
(2) 启动项是程序启动传递的配置参数,而系统变量是支持和决定程序运行行为的变量
(3) 有些启动项也不是程序运行所需的,也就不是系统变量,如:defaults-file
### 7. 补充:状态变量
指我们不能设置改变的变量,由程序内部自己设置的变量,我们可以查看来了解服务器程序的运行状况
show [global|session] status [like 匹配模式];
六、mysql字符集
编码和解码:
编码:将字符映射为二进制数据的过程
解码:将二进制数据映射到字符的过程
常见字符集(五种):
ASCII:字符数范围0~128,1字节表示
Latin1(ISO 8859-1):字符数范围为0~256,1-2字节表示
GB2312:字符数范围6763(汉字)+682,1-2字节表示
GBK:在GB2312基础上的扩充(兼容),1-2字节表示
Unicode:世界级字符收编,UTF-8(1-4字节)、UTF-16(2-4字节)、UTF-32(4字节)
相关概念:
(1) 变长编码方式:
指使用不同字节数来表示一个字符的编码方式,比如上面提到的GB2312、Unicode
(2) 为什么有变长编码方式:
无非是兼容,比如Latin1用1-2字节表示,1字节表示就是因为兼容ASCII
mysql字符集要点:
### 1. mysql中的UTF-8
utf8mb3:阉割过的UTF-8字符集,用1-3字节表示,在mysql中utf8指的就是utf8mb3
utf8mb4:正宗的UTF-8字符集,用1-4字节表示
版本情况:MySQL>=8.0,将utf8mb4作为默认字符集
### 2.查看当前mysql支持的字符集
show (character set|charset) [like 匹配模式];
### 3.比较规则
一种字符集可以有多种比较规则,都有默认的比较规则
查看支持的比较规则:show collation [like 匹配模式];
示例:show collation like 'utf8\_%'(斜杠是转义符)
## 比较规则名称后缀含义
_ai accent insensitive 不区分重音
_as accent sensitive 区分重音
_ci case insensitive 不区分大小写
_cs case sensitive 区分大小写
_bin binary 以二进制大小比较
### 4. 字符集和比较规则
## 分类:
服务器级别、数据库级别、表级别、列级别
## 服务器级别:
(1) 相关系统变量:character_set_server(字符集)、collation_server(比较规则)
(2) 查看默认值:show variables where variable_name in('character_set_server','collation_server');
(3) 设置:启动项或配置文件方式
## 数据库级别
(1) 相关系统变量:character_set_database(字符集)、collation_database(比较规则)
(2) 查看默认值:要注意的是明确当前使用的数据库,使用【use 数据库】
(3) 设置:只能在创建数据库的时候指定默认字符集和比较规则(创建好之后修改语句无法作用),数据库级别默认是参考服务器级别的,所以我们一般默认就好
create database 数据库 character set 字符集 collation 比较规则;
## 表级别
(1) 查看:show table status from 数据库 like 表名;
(2) 设置:默认参考数据库级别的
create table 表名(...) character set 字符集 collation 比较规则;
## 列级别
(1) 查看:show full columns from 表名;
(2) 设置:默认参考表级别的
create table 表名(列名 类型 character set 字符集 collation 比较规则);
alter table 表名 modify 列名 类型 character set 字符集 collation 比较规则;
## 二者关系
字符集和比较规则是双向绑定的,如果修改了某个另一个也跟着改变
向上参考原则:列 >> 表 >> 数据库 >> 服务器
mysql字符集(客户端和服务端):
### 1.引入:
客户端和服务端之间进程通信发送数据会涉及到字符集的问题,于是出现了MySQL通信协议(规定了数据格式)
### 2.客户端字符集:
一般客户端请求编码字符集为操作系统当前使用的字符集
## 类UNIX
决定系统字符集的系统变量:LANG、LC_CTYPE、LC_ALL(优先级依次递增,以后者为准)
## Windows
字符集又称代码页
查看字符集:chcp
数值对应关系:936(GBK)、65001(UTF-8)
设置字符集:mysql -uroot -p --default-character-set=字符集;
### 3.服务器字符集
服务器主要维护了3个相关的字符:character_set_client、character_set_connection、character_set_result
## 连接:
当客户端和服务器建立连接后,在服务器会维护一个会话级别的变量来作为服务器响应的字符集,即character_set_client
## 处理:
处理请求时又会将character_set_client转换为会话级别的系统变量character_set_connection;
也就是用character_set_client字符集对请求数据解码,然后用character_set_connection字符集对数据进行编码;
与之对应的比较规则collation_connection。
## 响应
服务器处理请求后需要响应给客户端结果,这时又由系统变量character_set_result决定
## 总结:
所以来说只有保证连接、处理和响应三个环节的字符集一致才会保证顺利编解码和响应
## 一次性设置上面三个系统变量
set names 字符集;
### 4.字符集冲突
若客户端系统字符集、表字符集和列字符集冲突,则以【列字符集】为准(优先级更高)
### 5.字符集定义过程
客户端连接服务器(登录) >> 初始化客户端字符集并发送给服务器 >> 根据客户端字符集初始化服务器字符集(3个系统变量)