第01章_Linux下MySQL的安装与使用
1. 安装前说明
1.1 Linux系统及工具的准备
- 安装并启动好两台虚拟机: CentOS 7
- 掌握克隆虚拟机的操作
- mac地址
- 主机名
- ip地址
- UUID
- 掌握克隆虚拟机的操作
- 安装有 Xshell 和 Xftp 等访问CentOS系统的工具
- CentOS6和CentOS7在MySQL的使用中的区别
1. 防火墙: 6 是 iptables , 7 是 firewalld2. 启动服务的命令: 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的卸载
systemctl stop mysqld.service
rpm -qa | grep -i mysql# 或yum list installed | grep mysql
yum remove mysql-xxx mysql-xxx mysql-xxx mysqk-xxxx
- 查找相关文件
find / -name mysql
- 删除上述命令查找出的相关文件
rm -rf xxx
rm -rf /etc/my.cnf
2. MySQL的Linux版安装
2.1 MySQL的4大版本
MySQL Community Server 社区版本 ,开源免费,自由下载,但不提供官方技术支持,适用于大多数普通用户。MySQL Enterprise Edition 企业版本 ,需付费,不能在线下载,可以试用 30 天。提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。MySQL Cluster 集群版 ,开源免费。用于架设集群服务器,可将几个 MySQL Server 封装成一个Server。需要在社区版或企业版的基础上使用。MySQL Cluster CGE 高级集群版 ,需付费。
- 截止目前,官方最新版本为 8.0.27 。此前,8.0.0 在 2016.9.12日就发布了。
- 本课程中主要使用 8.0.25版本 。同时为了更好的说明MySQL8.0新特性,还会安装 MySQL5.7 版本,作为对比。
2.2 下载MySQL指定版本
![](https://img-blog.csdnimg.cn/518e2a962cae498ab3af5d5cf4d83a45.png)
![](https://img-blog.csdnimg.cn/3b7500a6cc1a48e78a46c2cc0aafc633.png)
- 如果安装Windows 系统下MySQL ,推荐下载 MSI安装程序 ;点击 Go to Download Page 进行下载即可
- Windows下的MySQL安装有两种安装程序
- mysql-installer-web-community-8.0.33.0.msi 下载程序大小:2.4M;安装时需要联网安 装组件。
- mysql-installer-community-8.0.33.0.msi 下载程序大小:435.7M;安装时离线安装即 可。推荐。
![](https://img-blog.csdnimg.cn/26fb54409eae4272bbac390eb27988d6.png)
安装方式
|
特点
|
rpm
|
安装简单,灵活性差,无法灵活选择版本、升级
|
rpm repository
|
安装包极小,版本安装简单灵活,升级方便,需要联网安装
|
通用二进制包
|
安装比较复杂,灵活性高,平台通用性好
|
源码包
|
安装最复杂,时间长,参数设置灵活,性能好
|
- 这里不能直接选择CentOS 7系统的版本,所以选择与之对应的 Red Hat Enterprise Linux
- https://downloads.mysql.com/archives/community/ 直接点Download下载RPM Bundle全量 包。包括了所有下面的组件。不需要一个一个下载了。
![](https://img-blog.csdnimg.cn/c627a2aee6a5405b8e9d54e72ab63a2c.png)
- 解压后rpm安装包 (红框为抽取出来的安装包)
2.3 CentOS7下检查MySQL依赖
chmod -R 777 /tmp
![](https://img-blog.csdnimg.cn/19982b6b2ef74498bed3f5ef1c156b81.png)
rpm -qa |grep libaio
- 如果存在libaio包如下:
rpm -qa|grep net-tools
- 如果存在net-tools包如下:
rpm -qa|grep net-tools
- 如果不存在需要到centos安装盘里进行rpm安装。安装linux如果带图形化界面,这些都是安装好的。
2.4 CentOS7下MySQL安装过程
rpm -ivh mysql-community-common-8.0.32-1.el7.x86_64.rpmrpm -ivh mysql-community-client-plugins-8.0.32-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-8.0.32-1.el7.x86_64.rpmrpm -ivh mysql-community-client-8.0.32-1.el7.x86_64.rpmrpm -ivh mysql-community-icu-data-files-8.0.32-1.el7.x86_64.rpmrpm -ivh mysql-community-server-8.0.32-1.el7.x86_64.rpm
- 注意: 如在检查工作时,没有检查mysql依赖环境在安装mysql-community-server会报错
- rpm 是Redhat Package Manage缩写,通过RPM的管理,用户可以把源代码包装成以rpm为扩展名的文件形式,易于安装。
- -i , --install 安装软件包
- -v , --verbose 提供更多的详细信息输出
- -h , --hash 软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好),展示进度条
![](https://img-blog.csdnimg.cn/68ecea0ca90b44998d22661f199a713d.png)
![](https://img-blog.csdnimg.cn/b4b778a5ac85429dad2ccc4c6ac93b88.png)
![](https://img-blog.csdnimg.cn/0844067a4c9e4f1fafa054c364a7ac13.png)
一个命令: yum remove mysql-libs 解决,清除之前安装过的依赖即可
mysql --version# 或mysqladmin --version
![](https://img-blog.csdnimg.cn/61f6bc15c1f04d0aa5253b4a09696d58.png)
rpm -qa |grep -i mysql
![](https://img-blog.csdnimg.cn/e7d03f870d7342169d1a54cc37e22c55.png)
mysqld --initialize --user = mysql
cat /var/log/mysqld.log
![](https://img-blog.csdnimg.cn/563165b1931e4d2e99e20258d46b5835.png)
# 加不加 .service 后缀都可以启动: systemctl start mysqld.service关闭: systemctl stop mysqld.service重启: systemctl restart mysqld.service查看状态: systemctl status mysqld.service
mysqld 这个可执行文件就代表着 MySQL 服务器程序,运行这个可执行文件就可以直接启动一个服务器进程。
![](https://img-blog.csdnimg.cn/79819dc1696a46c2a3652e0735589c3a.png)
查看进程:
ps -ef | grep -i mysql
![](https://img-blog.csdnimg.cn/803cf2f59d5f461fa778e030c4407255.png)
systemctl list-unit-files|grep mysqld.service
![](https://img-blog.csdnimg.cn/8d8f14f1df6a4118a33edf789ccf2bea.png)
- 如不是enabled可以运行如下命令设置自启动
systemctl enable mysqld.service
- 如果希望不进行自启动,运行如下命令设置
systemctl disable mysqld.service
3. MySQL登录
3.1 首次登录
![](https://img-blog.csdnimg.cn/8475ba67f38d4ec085a2ba26b9d12ad1.png)
3.2 修改密码
- 因为初始化密码默认是过期的,所以查看数据库会报错
- 修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
- 5.7版本之后(不含5.7),mysql加入了全新的密码安全机制。设置新密码太简单会报错。
- 改为更复杂的密码规则之后,设置成功,可以正常使用数据库了
3.3 设置远程登录
![](https://img-blog.csdnimg.cn/6d70133263c544f482afb4a1e7cfa539.png)
telnet ip 地址 端口号
![](https://img-blog.csdnimg.cn/4d7a396b08d34247a79626c3f952888c.png)
- 方式一:关闭防火墙
- CentOS6 :
service iptables stop
- CentOS7:
systemctl start firewalld.servicesystemctl status firewalld.servicesystemctl stop firewalld.service# 设置开机启用防火墙systemctl enable firewalld.service# 设置开机禁用防火墙systemctl disable firewalld.service
- 查看开放的端口号
firewall-cmd --list-all
- 设置开放的端口号
firewall-cmd --add-service = http --permanentfirewall-cmd --add-port = 3306 /tcp --permanent
- 重启防火墙
firewall-cmd --reload
4. Linux下修改配置
use mysql;select Host, User from user ;
![](https://img-blog.csdnimg.cn/5168bf907ff84747bc76c1249ccd39b5.png)
- 修改Host为通配符%
update user set host = '%' where user = 'root' ;
![](https://img-blog.csdnimg.cn/da56a2598b244ddda802e0dbf693297b.png)
flush privileges ;
5. 测试
- 如果是 MySQL5.7 版本,接下来就可以使用SQLyog或者Navicat成功连接至MySQL了。
- 如果是 MySQL8 版本,连接时还会出现如下问题:
ALTER USER 'root' @'%' IDENTIFIED WITH mysql_native_password BY 'abc123' ;
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_123ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
4.2 MySQL8之前的安全策略
[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 beunloadedmysql>
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so' ;Query OK, 0 rows affected, 1 warning ( 0.11 sec)
4.3 MySQL8的安全策略
mysql> show variables like 'validate_password%' ;Empty set ( 0.04 sec)mysql> SELECT * FROM mysql .component ;ERROR 1146 ( 42 S02): 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_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 。
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 LOWSET GLOBAL validate_password_policy= 1 ; # For MEDIUMSET GLOBAL validate_password_policy= 2 ; # For HIGH# 注意,如果是插件的话 ,SQL 为 set global validate_password_policy=LOW
set global validate_password_length= 1 ;
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)
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字符集
show variables like 'character%' ;# 或者show variables like '%char%' ;
- MySQL8.0中执行:
![](https://img-blog.csdnimg.cn/8b8483379ed74f2ebbc8bba85d32a61e.png)
- MySQL5.7中执行:
![](https://img-blog.csdnimg.cn/9710b29c92304765ab5c4bffa23c0e92.png)
在MySQL5.7中添加中文数据时,报错:
![](https://img-blog.csdnimg.cn/01ec90bf492f47d1b99d080188755058.png)
vim /etc/my.cnf
character_set_server=utf8
![](https://img-blog.csdnimg.cn/b7f0c7c9c1704983899d80222810efb7.png)
systemctl restart mysqld
但是原库、原表的设定不会发生变化,参数修改只对新建的数据库生效。
![](https://img-blog.csdnimg.cn/dd937b15b06e438cbc18dfe5dd500f41.png)
alter database dbtest1 character set 'utf8' ;
alter table t_emp convert to character set 'utf8' ;
![](https://img-blog.csdnimg.cn/cf9b12012199474d909ab0ca5ab868c3.png)
注意:但是原有的数据如果是用非 'utf8' 编码的话,数据本身编码不会发生改变。已有数据需要导出或删除,然后重新插入。
5.2 各级别的字符集
- 服务器级别
- 数据库级别
- 表级别
- 列级别
show variables like 'character%' ;
![](https://img-blog.csdnimg.cn/55d124c2126f43c9b47cd4c0ae989cb1.png)
- character_set_server:服务器级别的字符集
- character_set_database:当前数据库的字符集
- character_set_client:服务器解码请求时使用的字符集
- character_set_connection:服务器处理请求时会把请求字符串从character_set_client转为 character_set_connection
- character_set_results:服务器向客户端返回数据时使用的字符集
- character_set_server :服务器级别的字符集。
[ server ]character_set_server=gbk # 默认字符集collation_server=gbk_chinese_ci # 对应的默认的比较规则
- character_set_database :当前数据库的字符集
CREATE DATABASE 数据库名[[ DEFAULT ] CHARACTER SET 字符集名称 ][[ DEFAULT ] COLLATE 比较规则名称 ];ALTER DATABASE 数据库名[[ DEFAULT ] CHARACTER SET 字符集名称 ][[ DEFAULT ] COLLATE 比较规则名称 ];
CREATE TABLE 表名 ( 列的信息 )[[ DEFAULT ] CHARACTER SET 字符集名称 ][ COLLATE 比较规则名称 ]]ALTER TABLE 表名[[ DEFAULT ] CHARACTER SET 字符集名称 ][ COLLATE 比较规则名称 ]
CREATE TABLE 表名 (列名 字符串类型 [ CHARACTER SET 字符集名称 ] [ COLLATE 比较规则名称 ],其他列 ...);ALTER TABLE 表名 MODIFY 列名 字符串类型 [ CHARACTER SET 字符集名称 ] [ COLLATE 比较规则名称 ];
提示在转换列的字符集时需要注意,如果转换前列中存储的数据不能用转换后的字符集进行表示会发生错误。比方说原先列使用的字符集是utf8 ,列中存储了一些汉字,现在把列的字符集转换为 ascii 的话就会出错,因为ascii 字符集并不能表示汉字字符。
- 如果 创建或修改列 时没有显式的指定字符集和比较规则,则该列 默认用表的 字符集和比较规则
- 如果 创建表时 没有显式的指定字符集和比较规则,则该表 默认用数据库的 字符集和比较规则
- 如果 创建数据库时 没有显式的指定字符集和比较规则,则该数据库 默认用服务器的 字符集和比较规则
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)
5.3 字符集与比较规则(了解)
- utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
- utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。
后缀
|
英文释义
|
描述
|
_ai
|
accent insensitive
|
不区分重音
|
_as
|
accent sensitive
|
区分重音
|
_ci
|
case insensitive
|
不区分大小写
|
_cs
|
case sensitive
|
区分大小写
|
_bin
|
binary
|
以二进制方式比较
|
最后一列 Maxlen ,它代表该种字符集表示一个字符最多需要几个字节。
# 查看 GBK 字符集的比较规则SHOW COLLATION LIKE 'gbk%' ;# 查看 UTF-8 字符集的比较规则SHOW COLLATION LIKE 'utf8%' ;
# 查看服务器的字符集和比较规则SHOW VARIABLES LIKE '%_server' ;# 查看数据库的字符集和比较规则SHOW VARIABLES LIKE '%_database' ;# 查看具体数据库的字符集SHOW CREATE DATABASE dbtest1;# 修改具体数据库的字符集ALTER DATABASE dbtest1 DEFAULT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' ;
# 查看表的字符集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
|
服务器向客户端返回数据时使用的字符集
|
![](https://img-blog.csdnimg.cn/a7f65e7f5acf4a2abef5529af361d668.png)
mysql> set character_set_connection = gbk;Query OK, 0 rows affected ( 0.00 sec)
SELECT * FROM t WHERE s = ' 我 ' ;
- 类 Unix 系统使用的是 utf8
- Windows 使用的是 gbk
提示如果你使用的是可视化工具,比如 navicat 之类的,这些工具可能会使用自定义的字符集来编码发送到服务器的字符串,而不采用操作系统默认的字符集(所以在学习的时候还是尽量用命令行窗口)。
由于我的计算机上 character_set_client 的值是 utf8 ,首先会按照 utf8 字符集对字节串 0xE68891 进行解码,得到的字符串就是 '我' ,然后按照 character_set_connection 代表的 字符集,也就是 gbk 进行编码,得到的结果就是字节串 0xCED2 。
提示如果某个列使用的字符集和 character_set_connection 代表的字符集不一致的话,还需要进行一次字符集转换。
![](https://img-blog.csdnimg.cn/bcda4eeed50b40a09d6aaa746b1b8d12.png)
6. SQL大小写规范
6.1 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下大小写规则设置
- 但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将找不到数据库名。
- 此参数适用于MySQL5.7。在MySQL 8下禁止在重新启动 MySQL 服务时将
1、停止MySQL服务
2 、删除数据目录,即删除 /var/lib/mysql 目录3 、在 MySQL 配置文件(/etc/my.cnf )中添加 lower_case_table_names=14 、启动 MySQL 服务
6.3 SQL编写建议
1. 关键字和函数名称全部大写;2. 数据库名、表名、表别名、字段名、字段别名等全部小写;3. SQL 语句必须以分号结尾。
7. sql_mode的合理设置
7.1 宽松模式 vs 严格模式
7.2 宽松模式再举例
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 ;
![](https://img-blog.csdnimg.cn/07b499f612564ca5b18851df14ff8f52.png)
![](https://img-blog.csdnimg.cn/dd13a59448e64d1bb56c0abf4c72b31e.png)
设置 sql_mode 模式为 STRICT_TRANS_TABLES ,然后插入数据:
7.3 模式查看和设置
- 查看当前的sql_mode
select @@session.sql_modeselect @@global.sql_mode# 或者show variables like 'sql_mode' ;
![](https://img-blog.csdnimg.cn/37a4b24ba6be4f6089b69dbe730c2955.png)
- 临时设置方式:设置当前窗口中设置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
[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