mysql学习5
mysql的启动
服务器启动
mysqld启动mysql进程
mysqld_safe调用mysqld并监控运行状态,帮助重启服务器,并将错误信息输出到错误日志
mysql.server调用mysqld_safe,mysql.server start启动服务器
mysqld_mult启动或停止多个mysql
mysqld –console查看启动日志
mysqld -P 3307指定启动端口
mysql通信协议
mysql使用tcp协议进行客户端和服务器通信
如果是windows系统使用命名管道或共享内存通信,共享内存需要客户端和服务器在同一台机器上
如果是mac系统使用unix域套接字通信,mysql默认监听/tmp/mysql.socket文件,若要修改可通过mysqld –socket=/tmp/mysql2.socket,客户端也可mysql -h localhost -u root -p –socket=/tmp/mysql2.socket
mysql处理客户端请求
每当有客户端连接服务器会创建一个线程处理,客户端退出线程不会立即销毁,而是等待其他客户端的连接再分配
mysql查询缓存:两个查询请求有任何字符不同都不会导致命中,某些系统函数如now不可能命中,查询缓存是表级别的,若表被修改过则清空整张表的查询缓存,mysql8中直接删除了查询缓存
mysql处理请求过程分为server层和存储引擎层,server写把查询到的数据发送到缓冲区,等缓冲区满了再发送给客户端,缓冲区大小由net_buffer_length控制
存储引擎的一些操作
show engines查询服务器支持的存储引擎,xa表示是否支持分布式事务,savepoints表示是否支持分布式部分回滚
创建表时可以指定存储引擎
1 | create table user () engine = InnoDB; |
mysql的启动项和配置文件
禁止使用tcp网络通信
1 | mysqld --skip-networking |
启动服务器时指定存储引擎
1 | mysqld --default-storage-engine=MyISAM |
mysql配置文件:/ect/my.cnf, /ect/mysql/my.cnf, ~/.my.cnf
~/.my.cnf的优先级大于/ect/my.cnf
配置文件添加默认配置
1 | [server] |
启动项的优先级高于配置文件
系统变量
查看系统变量
1 | show variables like 'default_storage_engine'; // 必须使用_ |
系统变量的作用范围:global和session
启动服务器使用的是global,每当有客户端链接作用范围为session
单独设置global和session的系统变量
1 | set global default_storage_engine=MyISAM; |
单独查看global和session的系统变量
1 | show global variables like 'default_storage_engine'; |
max_connections只有global范围
insert_id(AUTO_INCREMENT时的初始值)只有session范围
状态变量
Threads_connected表示有多少个链接的客户端
查看状态变量
1 | show status like 'thread%'; |
字符集
Latin1: iso 8859-1共收录256个字符
utf-8使用1-4个字节编码
utf8mb3: 只有1-3个字节的utf-8
utf8mb4: 1-4个字节,4字节可保存emoji表情,mysql8中的默认字符集
查看字符集
1 | show charset; |
default collation表示字符集的默认比较规则
查看比较规则
1 | show collation like 'utf8%'; |
utf8_general_ci(默认)表示通用规则不区分大小写,utf8_general_cs区分大小写
1 | select 'a' = 'A'; // 返回true |
查看服务器级别的字符集和比较规则
1 | show variables like 'character_set_server'; |
可以在配置文件修改字符集和比较规则
1 | [server] |
也可以在创建数据库时声明
1 | create database test character set gb2312 collate gb2312_chinese_ci; |
表级别的字符集
1 | create table user () character set utf8 collate utf8_general_ci; |
行级别的字符集
1 | alter tbaler user modify name varchar(20) character set gbk collate gbk_chinese_ci; |
只修改字符集,比较规则也会跟着变为相应的默认,
只修改比较规则,字符集也会相应改变
操作系统的字符集可通过环境变量查看,优先级$LC_ALL > $LC_CTYPE > $LANG
windows系统可通过chcp命令查看,936表示GBK,65001表示utf-8
客户端的字符集,客户端使用utf8请求
1 | mysql --default_character_set=utf8 |
三种系统变量:character_set_client, character_set_connection, character_set_results
三者为session级别
default_character_set: 客户端发送数据使用的编码
1.character_set_client: 服务器认为客户端使用该编码
2.character_set_connection: 请求处理时使用的编码
3.character_set_results: 返回给客户端数据时使用的编码
character_set_server: 数据存储的编码
客户端的默认字符集为操作系统默认字符集,若操作系统字符集为ascii,则mysql客户端默认字符集为latin1,mysql5.7使用latin1为默认字符集,mysql8使用utf8mb4为默认字符集,若设置了default-character-set则忽略操作系统默认字符集,服务器收到上述三种字符集后初始化为客户端默认字符集