欢迎咱们重视github.com/hsfxuebao,期望对咱们有所协助,要是觉得能够的话麻烦给点一下Star哈
1. 装置前阐明
1.1 Linux体系及东西的准备
- 装置并发动好两台虚拟机: CentOS 7
- 掌握克隆虚拟机的操作
- mac地址
- 主机名
- ip地址
- UUID
- 装置有 Xshell 和 Xftp 等拜访CentOS体系的东西
- CentOS6和CentOS7在MySQL的运用中的差异
防火墙:6是iptables,7是firewalld
发动服务的指令:6是service,7是systemctl
1.2 检查是否装置过MySQL
- 假如你是用rpm装置, 检查一下RPM PACKAGE:
rpm -qa | grep -i mysql # -i 疏忽巨细写
- 检查mysql service:
systemctl status mysqld.service
- 假如存在mysql-libs的旧版别包,显现如下:
- 假如不存在mysql-lib的版别,显现如下:
1.3 MySQL的卸载
- 封闭 mysql 服务
systemctl stop mysqld.service
- 检查当时 mysql 装置状况
rpm -qa | grep -i mysql
# 或
yum list installed | grep mysql
- 卸载上述指令查询出的已装置程序
yum remove mysql-xxx mysql-xxx mysql-xxx mysqk-xxxx
有必要卸载洁净,反复履行rpm -qa | grep -i mysql
承认是否有卸载残留
- 删去 mysql 相关文件 查找相关文件
find / -name mysql
删去上述指令查找出的相关文件
rm -rf xxx
- 删去 my.cnf
2. MySQL的Linux版装置
2.1 MySQL的4大版别
MySQL Community Server 社区版别
,开源免费,自由下载,但不提供官方技术支撑,适用于大多数普通用户。MySQL Enterprise Edition 企业版别
,需付费,不能在线下载,能够试用30天。提供了更多的功用和更完备的技术支撑,更适合于对数据库的功用和牢靠性要求较高的企业客户。MySQL Cluster 集群版
,开源免费。用于架起集群服务器,可将几个MySQL Server封装成一个Server。需求在社区版或企业版的基础上运用。MySQL Cluster CGE 高级集群版
,需付费。
官方还提供了 MySQL Workbench (GUITOOL)
一款专为MySQL规划的 ER/数据库建模东西 。它是著名的数据库规划东西DBDesigner4的继任者。MySQLWorkbench
又分为两个版别,分别是 社区版(MySQL Workbench OSS
)、商用版 (MySQL WorkbenchSE)
。
2.2 下载MySQL指定版别
1. 下载地址
官方:www.mysql.com/
2. 翻开官网,点击DOWNLOADS
然后,点击 MySQL Community(GPL) Downloads
3. 点击 MySQL Community Server
4. 在General Availability(GA) Releases中挑选适合的版别
假如装置Windows 体系下MySQL ,引荐下载MSI装置程序
;点击Go to Download Page
进行下载,
即可:
- Windows下的MySQL装置有两种装置程序
- mysql-installer-web-community-8.0.25.0.msi下载程序巨细:2.4M;装置时需求联网装置组件。
- mysql-installer-community-8.0.25.0.msi下载程序巨细:435.7M;装置时离线装置即可。引荐。
5. Linux体系下装置MySQL的几种办法
5.1 Linux体系下装置软件的常用三种办法:
办法1:rpm指令 运用rpm指令装置扩展名为”.rpm”的软件包。 .rpm包的一般格局:
办法2:yum指令 需联网,从 互联网获取 的yum源,直接运用yum指令装置。
办法3:编译装置源码包 针对tar.gz这样的压缩格局,要用tar指令来解压;假如是其它压缩格局,就运用其它指令。
5.2 Linux体系下装置MySQL,官方给出多种装置办法
装置办法 | 特点 |
---|---|
rpm | 装置简单,灵敏性差,无法灵敏挑选版别、晋级 |
rpm repository | 装置包极小,版别装置简单灵敏,晋级便利,需求联网装置 |
通用二进制包 | 装置比较复杂,灵敏性高,渠道通用性好 |
源码包 | 装置最复杂,时间长,参数设置灵敏,功能好 |
- 这儿不能直接挑选CentOS 7体系的版别,所以挑选与之对应的 Red Hat Enterprise Linux|
- downloads.mysql.com/archives/co… Bundle全量包。包含了一切下面的组件。不需求一个一个下载了。
6. 下载的tar包,用压缩东西翻开
解压后rpm装置包 (红框为抽取出来的装置包)
2.3 CentOS7下检查MySQL依靠
1. 检查/tmp暂时目录权限(必不可少)
由于mysql装置过程中,会经过mysql用户在/tmp目录下新建tmp_db文件,所以请给/tmp较大的权限。履行 :
chmod -R 777 /tmp
2. 装置前,检查依靠
rpm -qa|grep libaio
假如存在libaio包如下:
rpm -qa|grep net-tools
假如存在net-tools包如下:
rpm -qa|grep net-tools
假如不存在需求到centos装置盘里进行rpm装置。装置linux假如带图形化界面,这些都是装置好的。
2.4 CentOS7下MySQL装置过程
1. 将装置程序拷贝到/opt目录下
在mysql的装置文件目录下履行:(有必要按照顺序履行)
rpm -ivh mysql-community-common-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-plugins-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.25-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.25-1.el7.x86_64.rpm
- 留意: 如在检查工作时,没有检查mysql依靠环境在装置mysql-community-server会报错
- rpm 是Redhat Package Manage缩写,经过RPM的管理,用户能够把源代码包装成以rpm为扩展名的文件方法,易于装置。
- -i , –install 装置软件包
- -v , –verbose 提供更多的详细信息输出
- -h , –hash 软件包装置的时分列出哈希标记 (和 -v 一同运用作用更好),展示进度条
2. 装置过程截图
装置过程中或许的报错信息
一个指令:yum remove mysql-libs 处理,铲除之前装置过的依靠即可
3. 检查MySQL版别
履行如下指令,假如成功表明装置mysql成功。相似java -version假如打出版别等信息
mysql --version
#或
mysqladmin --version
履行如下指令,检查是否装置成功。需求增加 -i 不必去差异巨细写,不然查找不到。
rpm -qa|grep -i mysql
4. 服务的初始化
为了确保数据库目录与文件的一切者为 mysql 登录用户,假如你是以 root 身份运转 mysql 服务,需求执 行下面的指令初始化:
mysqld --initialize --user=mysql
阐明:–initialize
选项默许以“安全”方法来初始化,则会为 root 用户生成一个暗码并将 该暗码标记为过期 ,登录后你需求设置一个新的暗码。生成的 暂时暗码 会往日志中记载一份。
检查暗码:
cat /var/log/mysqld.log
root@localhost: 后面便是初始化的暗码
5. 发动MySQL,检查状况
#加不加.service后缀都能够
发动:systemctl start mysqld.service
封闭:systemctl stop mysqld.service
重启:systemctl restart mysqld.service
检查状况:systemctl status mysqld.service
mysqld 这个可履行文件就代表着 MySQL 服务器程序,运转这个可履行文件就能够直接发动一个服务器进程。
检查进程:
ps -ef | grep -i mysql
6. 检查MySQL服务是否自发动
systemctl list-unit-files|grep mysqld.service
默许是enabled。
- 如不是enabled能够运转如下指令设置自发动
systemctl enable mysqld.service
- 假如期望不进行自发动,运转如下指令设置
systemctl disable mysqld.service
3. MySQL登录
3.1 首次登录
经过 mysql -hlocalhost -P3306 -uroot -p
进行登录,在Enter password:录入初始化暗码
3.2 修正暗码
由于初始化暗码默许是过期的,所以检查数据库会报错
修正暗码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
5.7版别之后(不含5.7),mysql参加了全新的暗码安全机制。设置新暗码太简单会报错。
改为更复杂的暗码规矩之后,设置成功,能够正常运用数据库了
3.3 设置长途登录
1. 当时问题
在用SQLyog或Navicat中装备长途衔接Mysql数据库时遇到如下报错信息,这是由于Mysql装备了不支撑长途衔接引起的。
2. 承认网络
1.在长途机器上运用ping ip地址 确保网络疏通 2.在长途机器上运用telnet指令 确保端口号敞开 拜访
telnet ip地址 端口号
拓展: telnet指令开启 :
3. 封闭防火墙或敞开端口
办法一:封闭防火墙
- CentOS6 :
service iptables stop
- CentOS7
systemctl start firewalld.service
systemctl status firewalld.service
systemctl stop firewalld.service
#设置开机启用防火墙
systemctl enable firewalld.service
#设置开机禁用防火墙
systemctl disable firewalld.service
办法二:敞开端口
检查敞开的端口号
firewall-cmd --list-all
设置敞开的端口号
firewall-cmd --add-service=http --permanent
firewall-cmd --add-port=3306/tcp --permanent
重启防火墙
firewall-cmd --reload
4. Linux下修正装备
在Linux体系MySQL下测验:
use mysql;
select Host,User from user;
能够看到root用户的当时主机装备信息为localhost。
- 修正Host为通配符%
Host列指定了答应用户登录所运用的IP,比方
user=root Host=192.168.1.1
。这儿的意思便是说root用户只能经过192.168.1.1的客户端去拜访。user=root Host=localhost
,表明只能经过本机客户端去拜访。而 %是个 通配符 ,假如Host=192.168.1.%
,那么就表明只要是IP地址前缀为“192.168.1.”的客户端都能够衔接。假如 Host=% ,表明一切IP都有衔接权限。 留意:在生产环境下不能为了省事将host设置为%,这样做会存在安全问题,详细的设置能够依据生产环境的IP进行设置。
update user set host = '%' where user ='root';
Host设置了“%”后便能够答应长途拜访。
Host修正完成后记住履行flush privileges使装备当即收效
flush privileges;
5. 测验
假如是 MySQL5.7 版别,接下来就能够运用SQLyog或许Navicat成功衔接至MySQL了。
假如是 MySQL8.0 版别,衔接时还会呈现如下问题
装备新衔接报错:过错号码 2058,剖析是 mysql 暗码加密办法变了。**处理办法:**
Linux下 mysql -u root -p 登录你的 mysql 数据库,然后 履行这条SQL:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123';
然后在重新装备SQLyog的衔接,则可衔接成功了,OK。
4. MySQL8的暗码强度评价(了解)
4.1 MySQL不同版别设置暗码(或许呈现)
MySQL5.7中:成功
mysql> alter user 'root' identified by 'abcd1234';
Query OK, 0 rows affected (0.00 sec)
MySQL8.0中:失败
mysql> alter user 'root' identified by 'abcd1234'; # HelloWorld_123
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
4.2 MySQL8之前的安全策略
在MySQL 8.0之前,MySQL运用的是validate_password插件检测、验证账号暗码强度,保障账号的安全性。 装置/启用插件办法1:在参数文件my.cnf中增加参数
[mysqld]
plugin-load-add=validate_password.so
#ON/OFF/FORCE/FORCE_PLUS_PERMANENT: 是否运用该插件(及强制/永久强制运用)
validate-password=FORCE_PLUS_PERMANENT
阐明1: plugin library中的validate_password文件名的后缀名依据渠道不同有所差异。 关于Unix和Unix-like体系而言,它的文件后缀名是.so,关于Windows体系而言,它的文件后缀名是.dll。
阐明2: 修正参数后有必要重启MySQL服务才能收效。
阐明3: 参数FORCE_PLUS_PERMANENT是为了避免插件在MySQL运转时的时分被卸载。当你卸载插件时就会报错。如下所示。
mysql> SELECT PLUGIN_NAME, PLUGIN_LIBRARY, PLUGIN_STATUS, LOAD_OPTION
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME = 'validate_password';
+-------------------+----------------------+---------------+----------------------+
| PLUGIN_NAME | PLUGIN_LIBRARY | PLUGIN_STATUS | LOAD_OPTION |
+-------------------+----------------------+---------------+----------------------+
| validate_password | validate_password.so | ACTIVE | FORCE_PLUS_PERMANENT |
+-------------------+----------------------+---------------+----------------------+
1 row in set (0.00 sec)
mysql> UNINSTALL PLUGIN validate_password;
ERROR 1702 (HY000): Plugin 'validate_password' is force_plus_permanent and can not be
unloaded
mysql>
装置/启用插件办法2:运转时指令装置(引荐)
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Query OK, 0 rows affected, 1 warning (0.11 sec)
此办法也会注册到元数据,也便是mysql.plugin表中,所以不必忧虑MySQL重启后插件会失效。
4.3 MySQL8的安全策略
1. validate_password阐明
MySQL 8.0,引入了服务器组件(Components)这个特性,validate_password插件已用服务器组件重新完成。8.0.25版其他数据库中,默许主动装置validate_password组件。
未装置插件前,履行如下两个指令 ,履行作用:
mysql> show variables like 'validate_password%';
Empty set (0.04 sec)
mysql> SELECT * FROM mysql.component;
ERROR 1146 (42S02): Table 'mysql.component' doesn't exist
装置插件后,履行如下两个指令 ,履行作用:
mysql> SELECT * FROM mysql.component;
+--------------+--------------------+------------------------------------+
| component_id | component_group_id | component_urn |
+--------------+--------------------+------------------------------------+
| 1 | 1 | file://component_validate_password |
+--------------+--------------------+------------------------------------+
1 row in set (0.00 sec)
mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| validate_password.check_user_name | ON |
| validate_password.dictionary_file | |
| validate_password.length | 8 |
| validate_password.mixed_case_count | 1 |
| validate_password.number_count | 1 |
| validate_password.policy | MEDIUM |
| validate_password.special_char_count | 1 |
+--------------------------------------+--------+
7 rows in set (0.01 sec)
关于validate_password组件对应的体系变量阐明:
选项 | 默许值 | 参数描绘 | ||
---|---|---|---|---|
validate_password_check_user_name | ON | 设置为ON的时分表明能将暗码设置成当时用户名。 | ||
validate_password_dictionary_file | 用于检查暗码的字典文件的路径名,默许为空 | |||
validate_password_length |
8 | 暗码的最小长度,也便是说暗码长度有必要大于或等于8 | ||
validate_password_mixed_case_count | 1 | 假如暗码策略是中等或更强 | 的, | validate_password要求暗码具有的小写和大写字符的最小数量。关于给定的这个值暗码有必要有那么多小写字符和那么多大写字符。 |
validate_password_number_count | 1 | 暗码有必要包含的数字个数 | ||
validate_password_policy |
MEDIUM | 暗码强度检验等级,能够运用数值0、1、2或相应的符号值 LOW、MEDIUM、STRONG来指定。 0/LOW :只检查长度。1/MEDIUM :检查长度、数字、巨细写、特别字符。 2/STRONG :检查长度、数字、巨细写、特别字符、字典文件。 | ||
validate_password_special_char_count | 1 | 暗码有必要包含的特别字符个数 |
提示:
组件和插件的默许值或许有所不同。
例如,MySQL 5.7. validate_password_check_user_name的默许值为OFF。
2. 修正安全策略
修正暗码验证安全强度
SET GLOBAL validate_password_policy=LOW;
SET GLOBAL validate_password_policy=MEDIUM;
SET GLOBAL validate_password_policy=STRONG;
SET GLOBAL validate_password_policy=0; # For LOW
SET GLOBAL validate_password_policy=1; # For MEDIUM
SET GLOBAL validate_password_policy=2; # For HIGH
#留意,假如是插件的话,SQL为set global validate_password_policy=LOW
此外,还能够修正暗码中字符的长度
set global validate_password_length=1;
3. 暗码强度测验
假如你创立暗码是遇到“Your password does not satisfy the current policy requirements”
,能够经过函数组件去检测暗码是否满意条件: 0-100。当评价在100时便是阐明运用上了最基本的规矩:大写+小写+特别字符+数字组成的8位以上暗码
mysql> SELECT VALIDATE_PASSWORD_STRENGTH('medium');
+--------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('medium') |
+--------------------------------------+
| 25 |
+--------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT VALIDATE_PASSWORD_STRENGTH('K354*45jKd5');
+-------------------------------------------+
| VALIDATE_PASSWORD_STRENGTH('K354*45jKd5') |
+-------------------------------------------+
| 100 |
+-------------------------------------------+
1 row in set (0.00 sec)
留意:假如没有装置validate_password组件或插件的话,那么这个函数永久都回来0。 关于暗码复杂度对应的暗码复杂度策略。如下表格所示:
Password Test | Return Value |
---|---|
Length < 4 | 0 |
Length ≥ 4 and < validate_password.length | 25 |
Satisfies policy 1 (LOW) | 50 |
Satisfies policy 2 (MEDIUM) | 75 |
Satisfies policy 3 (STRONG) | 100 |
4.4 卸载插件、组件(了解)
卸载插件
mysql> UNINSTALL PLUGIN validate_password;
Query OK, 0 rows affected, 1 warning (0.01 sec)
卸载组件
mysql> UNINSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.02 sec)
5. 字符集的相关操作
5.1 修正MySQL5.7字符集
1. 修正过程
在MySQL 8.0版别之前,默许字符集为latin1 ,utf8字符集指向的是utf8mb3 。网站开发人员在数据库规划的时分往往会将编码修正为utf8字符集。假如忘记修正默许的编码,就会呈现乱码的问题。从MySQL8.0开端,数据库的默许编码将改为 utf8mb4 ,然后避免上述乱码的问题。 操作1:检查默许运用的字符集
show variables like 'character%';
# 或许
show variables like '%char%';
MySQL8.0中履行:
MySQL5.7中履行: MySQL 5.7 默许的客户端和服务器都用了latin1 ,不支撑中文,保存中文会报错。MySQL5.7截图如下:
在MySQL5.7中增加中文数据时,报错:
由于默许情况下,创立表运用的是latin1。如下:
操作2:修正字符集
vim /etc/my.cnf
在MySQL5.7或之前的版别中,在文件最终加上中文字符集装备:
character_set_server=utf8
操作3:重新发动MySQL服务
systemctl restart mysqld
可是原库、原表的设定不会产生改变,参数修正只对新建的数据库收效。
2. 已有库&表字符集的改变
MySQL5.7版别中,曾经创立的库,创立的表字符集还是latin1。
修正已创立数据库的字符集
alter database dbtest1 character set 'utf8';
修正已创立数据表的字符集
alter table t_emp convert to character set 'utf8';
留意:可是原有的数据假如是用非’utf8’编码的话,数据本身编码不会产生改变。已有数据需求导 出或删去,然后重新刺进。
5.2 各级其他字符集
MySQL有4个级其他字符集和比较规矩,分别是:
- 服务器等级
- 数据库等级
- 表等级
- 列等级 履行如下SQL句子:
show variables like 'character%';
- character_set_server:服务器级其他字符集
- character_set_database:当时数据库的字符集
- character_set_client:服务器解码恳求时运用的字符集
- character_set_connection:服务器处理恳求时会把恳求字符串从character_set_client转为
- character_set_connection
- character_set_results:服务器向客户端回来数据时运用的字符集
1. 服务器等级
character_set_server:服务器级其他字符集。 咱们能够在发动服务器程序时经过发动选项或许在服务器程序运转过程中运用 SET 句子修正这两个变量的值。比方咱们能够在装备文件中这样写:
[server]
character_set_server=gbk # 默许字符集
collation_server=gbk_chinese_ci #对应的默许的比较规矩
当服务器发动的时分读取这个装备文件后这两个体系变量的值便修正了。
2. 数据库等级
character_set_database
:当时数据库的字符集
咱们在创立和修正数据库的时分能够指定该数据库的字符集和比较规矩,详细语法如下:
CREATE DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集称号]
[[DEFAULT] COLLATE 比较规矩称号];
ALTER DATABASE 数据库名
[[DEFAULT] CHARACTER SET 字符集称号]
[[DEFAULT] COLLATE 比较规矩称号];
3. 表等级
咱们也能够在创立和修正表的时分指定表的字符集和比较规矩,语法如下:
CREATE TABLE 表名 (列的信息)
[[DEFAULT] CHARACTER SET 字符集称号]
[COLLATE 比较规矩称号]]
ALTER TABLE 表名
[[DEFAULT] CHARACTER SET 字符集称号]
[COLLATE 比较规矩称号]
**假如创立和修正表的句子中没有指明字符集和比较规矩,将运用该表地点数据库的字符集和比较规矩作为该表的字符集和比较规矩。**
4. 列等级
关于存储字符串的列,同一个表中的不同的列也能够有不同的字符集和比较规矩。咱们在创立和修正列定义的时分能够指定该列的字符集和比较规矩,语法如下:
CREATE TABLE 表名(
列名 字符串类型 [CHARACTER SET 字符集称号] [COLLATE 比较规矩称号],
其他列...
);
ALTER TABLE 表名 MODIFY 列名 字符串类型 [CHARACTER SET 字符集称号] [COLLATE 比较规矩称号];
关于某个列来说,假如在创立和修正的句子中没有指明字符集和比较规矩,将运用该列地点表的字符集和比较规矩作为该列的字符集和比较规矩。
提示
在转化列的字符集时需求留意,假如转化前列中存储的数据不能用转化后的字符集进行表明会产生过错。比方说原先列运用的字符集是utf8,列中存储了一些汉字,现在把列的字符集转化为ascii的话就会出错,由于ascii字符集并不能表明汉字字符。
5. 小结
咱们介绍的这4个等级字符集和比较规矩的联系如下:
- 假如
创立或修正列
时没有显式的指定字符集和比较规矩,则该列默许用表的
字符集和比较规矩 - 假如
创立表时
没有显式的指定字符集和比较规矩,则该表默许用数据库的
字符集和比较规矩 - 假如
创立数据库时
没有显式的指定字符集和比较规矩,则该数据库默许用服务器的
字符集和比较规矩 知道了这些规矩之后,关于给定的表,咱们应该知道它的各个列的字符集和比较规矩是什么,然后依据这个列的类型来确认存储数据时每个列的实践数据占用的存储空间巨细了。比方说咱们向表 t 中刺进一条记载
mysql> INSERT INTO t(col) VALUES('咱们');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM t;
+--------+
| s |
+--------+
| 咱们 |
+--------+
1 row in set (0.00 sec)
首先列 col 运用的字符集是 gbk,一个字符’我’ 在 gbk 中的编码为 0xCED2,占用两个字节,两个字符的实践数据就占用4个字节。假如把该列的字符集修正为 utf8 的话,这两个字符就实践占用6个字节
5.3 字符集与比较规矩(了解)
1. utf8 与 utf8mb4
utf8
字符集表明一个字符需求运用1~4个字节,可是咱们常用的一些字符运用1~3个字节就能够表明
了。而字符集表明一个字符所用的最大字节长度,在某些方面会影响体系的存储和功能,所以规划
MySQL的规划者悄悄的定义了两个概念:
-
utf8mb3
:阉割过的utf8
字符集,只运用1~3个字节表明字符。 -
utf8mb4
:正宗的utf8
字符集,运用1~4个字节表明字符。
2. 比较规矩
上表中,MySQL版别一共支撑41种字符集,其中的 Default collation
列表明这种字符集中一种默许的比较规矩,里边包含着该比较规矩首要作用于哪种语言,比方utf8_polish_ci
表明以波兰语的规矩比较, utf8_spanish_ci
是以西班牙语的规矩比较, utf8_general_ci
是一种通用的比较规矩。
后缀表明该比较规矩是否差异语言中的重音、巨细写。详细如下:
后缀 | 英文释义 | 描绘 |
---|---|---|
_ai | accent insensitive | 不差异重音 |
_as | accent sensitive | 差异重音 |
_ci | case insensitive | 不差异巨细写 |
_cs | case sensitive | 差异巨细写 |
_bin | binary | 以二进制办法比较 |
最终一列 Maxlen
,它代表该种字符集表明一个字符最多需求几个字节。
常用操作1:
#检查GBK字符集的比较规矩
SHOW COLLATION LIKE 'gbk%';
#检查UTF-8字符集的比较规矩
SHOW COLLATION LIKE 'utf8%';
常用操作2:
#检查服务器的字符集和比较规矩
SHOW VARIABLES LIKE '%_server';
#检查数据库的字符集和比较规矩
SHOW VARIABLES LIKE '%_database';
#检查详细数据库的字符集
SHOW CREATE DATABASE dbtest1;
#修正详细数据库的字符集
ALTER DATABASE dbtest1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
常用操作3:
#检查表的字符集
show create table employees;
#检查表的比较规矩
show table status from atguigudb like 'employees';
#修正表的字符集和比较规矩
ALTER TABLE emp1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
5.4 恳求到呼应过程中字符集的改变
体系变量 | 描绘 |
---|---|
character_set_client |
服务器解码恳求时运用的字符集 |
character_set_connection |
服务器处理恳求时会把恳求字符串从character_set_client 转为character_set_connection
|
character_set_results |
服务器向客户端回来数据时运用的字符集 |
这几个体系变量在我的核算机上的默许值如下(不同操作体系的默许值或许不同):
为了体现出字符集在恳求处理过程中的改变,咱们这儿特意修正一个体系变量的值:
mysql> set character_set_connection = gbk;
Query OK, 0 rows affected (0.00 sec)
现在假定咱们客户端发送的恳求是下边这个字符串:
SELECT * FROM t WHERE s = '我';
-
为了便利咱们了解这个过程,咱们只剖析字符 ‘我’ 在这个过程中字符集的转化。现在看一下在恳求从发送到成果回来过程中字符集的改变:
- 客户端发送恳求所运用的字符集 一般情况下客户端所运用的字符集和当时操作体系共同,不同操作体系运用的字符集或许纷歧 样,如下:
- 类 Unix 体系运用的是 utf8
- Windows运用的是gbk 当客户端运用的是utf8 字符集,字符’我’在发送给服务器的恳求中的字节方法便是:0xE68891
提示
假如你运用的是可视化东西,比方navicat之类的,这些东西或许会运用自定义的字符集来编码发送到服务器的字符串,而不选用操作体系默许的字符集(所以在学习的时分还是尽量用指令行窗口)。-
服务器接收到客户端发送来的恳求其实是一串二进制的字节,它会认为这串字节选用的字符集是character_set_client ,然后把这串字节转化为 character_set_connection 字符集编码的字符。 由于我的核算机上 character_set_client 的值是utf8 ,首先会按照 utf8 字符集对字节串0xE68891 进行解码,得到的字符串便是 ‘我’,然后按照character_set_connection代表的字符集,也便是 gbk 进行编码,得到的成果便是字节串 0xCED2 。
-
由于表t的列col 选用的是 gbk 字符集,与character_set_connection 共同,所以直接到列中找字节值为0xCED2 的记载,最终找到了一条记载。
提示
假如某个列运用的字符集和character_set_connection代表的字符集不共同的话,还需求进行一次字符集转化。- 上一过程找到的记载中的 col列其实是一个字节串 0xCED2,col列是选用 gbk进行编码的,所以首先会将这个字节串运用 gbk进行解码,得到字符串 ‘我’ ,然后再把这个字符串运用character_set_results代表的字符集,也便是utf8进行编码,得到了新的字节串:0xE68891,然后发送给客户端。
- 由于客户端是用的字符集是 utf8,所以能够顺畅的将 0xE68891 解释成字符我 ,然后显现到咱们的显现器上,所以咱们人类也读懂了回来的成果。 总结图示如下:
6.SQL巨细写标准
6.1 Windows和Linux渠道差异
在 SQL 中,关键字和函数名是不必差异字母巨细写的,比方 SELECT、WHERE、ORDER、GROUP BY 等关键字,以及 ABS、MOD、ROUND、MAX 等函数名。
不过在 SQL 中,你还是要确认巨细写的标准,由于在 Linux 和 Windows 环境下,你或许会遇到不同的巨细写问题。 windows体系默许巨细写不灵敏
,可是 linux体系是巨细写灵敏的
。
经过如下指令检查:
SHOW VARIABLES LIKE '%lower_case_table_names%'
Windows体系下:
Linux体系下:
lower_case_table_names
参数值的设置:
- 默许为0,巨细写灵敏 。
- 设置1,巨细写不灵敏。创立的表,数据库都是以小写方法寄存在磁盘上,关于sql句子都是转化为小写对表和数据库进行查找。
- 设置2,创立的表和数据库依据句子上格局寄存,但凡查找都是转化为小写进行。 两个渠道上SQL巨细写的差异详细来说:
MySQL在Linux下数据库名、表名、列名、别号巨细写规矩是这样的:
1、数据库名、表名、表的别号、变量名是严厉差异巨细写的;
2、关键字、函数称号在 SQL 中不差异巨细写;
3、列名(或字段名)与列的别号(或字段别号)在一切的情况下均是疏忽巨细写的;
MySQL在Windows的环境下全部不差异巨细写
6.2 Linux下巨细写规矩设置
当想设置为巨细写不灵敏时,要在 my.cnf
这个装备文件 [mysqld]
中参加
lower_case_table_names=1
,然后重启服务器。
- 可是要在重启数据库实例之前就需求将原来的数据库和表转化为小写,不然将找不到数据库名。
- 此参数适用于MySQL5.7。在MySQL 8下禁止在重新发动 MySQL 服务时将
lower_case_table_names
设置成不同于初始化 MySQL 服务时设置的lower_case_table_names
值。假如非要将MySQL8设置为巨细写不灵敏,详细过程为:
1、中止MySQL服务
2、删去数据目录,即删去 /var/lib/mysql 目录
3、在MySQL装备文件( /etc/my.cnf )中增加 lower_case_table_names=1
4、发动MySQL服务
6.3 SQL编写主张
假如你的变量名命名标准没有一致,就或许产生过错。这儿有一个有关命名标准的主张:
关键字和函数称号全部大写;
数据库名、表名、表别号、字段名、字段别号等全部小写;
SQL 句子有必要以分号结尾。
数据库名、表名和字段名在 Linux MySQL 环境下是差异巨细写的,因此主张你一致这些字段的命名规矩,比方全部选用小写的办法。
尽管关键字和函数称号在 SQL 中不差异巨细写,也便是假如小写的话同样能够履行。可是同时将关键词和函数称号全部大写,以便于差异数据库名、表名、字段名。
7. sql_mode的合理设置
7.1 宽松方法 vs 严厉方法
宽松方法: 假如设置的是宽松方法,那么咱们在刺进数据的时分,即便是给了一个过错的数据,也或许会被承受,而且不报错。
举例:我在创立一个表时,该表中有一个字段为name,给name设置的字段类型时char(10) ,假如我 在刺进数据的时分,其中name这个字段对应的有一条数据的长度超过了10,例如’1234567890abc’,超过了设定的字段长度10,那么不会报错,而且取前10个字符存上,也便是说你这个数据被存为 了’1234567890’,而’abc’就没有了。可是,咱们给的这条数据是过错的,由于超过了字段长度,可是并没有报错,而且mysql自行处理并承受了,这便是宽松方法的作用。
应用场景 :经过设置sql mode为宽松方法,来确保大多数sql契合标准的sql语法,这样应用在不同数据 库之间进行 搬迁 时,则不需求对业务sql 进行较大的修正。
严厉方法: 呈现上面宽松方法的过错,应该报错才对,所以MySQL5.7版别就将sql_mode默许值改为了严厉方法。所以在生产等环境中,咱们有必要选用的是严厉方法,从而 开发、测验环境的数据库也有必要要设置,这样在开发测验阶段就能够发现问题。而且咱们即便是用的MySQL5.6,也应该自行将其改为严厉方法。
开发经历 :MySQL等数据库总想把关于数据的一切操作都自己包揽下来,包含数据的校验,其实开发中,咱们应该在自己 开发的项目程序等级将这些校验给做了 ,尽管写项目的时分麻烦了一些过程,可是这样做之后,咱们在进行数据库搬迁或许在项目的搬迁时,就会便利很多。
改为严厉方法后或许会存在的问题:
若设置方法中包含了 NO_ZERO_DATE ,那么MySQL数据库不答应刺进零日期,刺进零日期会抛出过错而不是正告。 例如,表中含字段TIMESTAMP列(假如未声明为NULL或显现DEFAULT子句)将主动分配DEFAULT ‘0000-00-00 00:00:00’(零时间戳),这显然是不满意sql_mode中的NO_ZERO_DATE而报错。
7.2 宽松方法再举例
宽松方法举例1:
select * from employees group by department_id limit 10;
set sql_mode = ONLY_FULL_GROUP_BY;
select * from employees group by department_id limit 10;
宽松方法举例2:
设置 sql_mode 方法为 STRICT_TRANS_TABLES ,然后刺进数据:
7.3 方法检查和设置
检查当时的sql_mode
select @@session.sql_mode
select @@global.sql_mode
#或许
show variables like 'sql_mode';
暂时设置办法:设置当时窗口中设置sql_mode
SET GLOBAL sql_mode = 'modes...'; #大局
SET SESSION sql_mode = 'modes...'; #当时会话
举例:
#改为严厉方法。此办法只在当时会话中收效,封闭当时会话就不收效了。
set SESSION sql_mode='STRICT_TRANS_TABLES';
#改为严厉方法。此办法在当时服务中收效,重启MySQL服务后失效。
set GLOBAL sql_mode='STRICT_TRANS_TABLES';
永久设置办法:在/etc/my.cnf中装备sql_mode 在my.cnf文件(windows体系是my.ini文件),新增:
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR
_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
然后 重启MySQL。
当然生产环境上是禁止重启MySQL服务的,所以选用 暂时设置办法 + 永久设置办法 来处理线上的问题,那么即便是有一天真的重启了MySQL服务,也会永久收效了。
参阅文章
MySQL从入门到通晓
MySQL是怎样运转的 从根儿上了解MySQL 第3章
《MySQL技术内情:InnoDB存储引擎(第2版)》
《数据库索引规划与优化》