MySQL SQL_MODE 的设置
SQL_MODE 的设置
查看当前的 SQL_MODE
SELECT @@sql_mode
SELECT @@sql_mode 的执行结果
mysql> SELECT @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
设置 SQL_MODE
设置 SQL_MODE 是通过 SET
关键词进行的,其他参数值也可通过该关键词进行修改。可通过 SHOW VARIABLES
查看到所有可用配置项。
设置系统变量时,可指定所设置的作用域,也可通过 @@
前缀来获取变量,甚至也可以没有任何前缀,以下写法都是合法的:
SET SESSION sql_mode = 'TRADITIONAL';
SET LOCAL sql_mode = 'TRADITIONAL';
SET @@SESSION.sql_mode = 'TRADITIONAL';
SET @@LOCAL.sql_mode = 'TRADITIONAL';
SET @@sql_mode = 'TRADITIONAL';
SET sql_mode = 'TRADITIONAL';
可用的 SQL 模式可在官方文档中查询到 5.1.10 Server SQL Modes。
系统变量的作用域
There are two scopes in which system variables exist. Global variables affect the overall operation of the server. Session variables affect its operation for individual client connections. A given system variable can have both a global and a session value.
系统的这些配置项有其作用项,是分开进行管理的。
其中,
GLOBAL
类型会对每次连接生效。SESSION
类型只对当前连接生效,LOCAL
关键词等效。
两者皆为运行时变量,可随时修改。
PERSIST
类型不影响运行时,会将设置结果写入mysqld-auto.cnf
这个 MySQL 配置文件。
所以,设置时可通过在 SET
后加相应作用域的修饰词,像这样
SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
也可以通过 @@
加上作用域进行变量访问的方式:
SET @@GLOBAL.sql_mode = 'NO_ENGINE_SUBSTITUTION';
两者是等效的。
作用域缺省情况下为 SESSION
类型,即只对当前连接生效。
SET @@sql_mode = 'NO_ENGINE_SUBSTITUTION';
MySQL 中的配置文件
下面表格来自官方文档 Table 4.2 Option Files Read on Unix and Unix-Like Systems 部分。
文件 | 用途 |
---|---|
/etc/my.cnf | 全局配置项 |
/etc/mysql/my.cnf | 全局配置项 |
SYSCONFDIR/my.cnf | 全局配置项 |
$MYSQL_HOME/my.cnf | 服务器相关配置项,有于服务端 |
defaults-extra-file | 如果存在该文件的话,通过--defaults-extra-file 参数启用程序时会读取该配置项 |
~/.my.cnf | 用户配置项 |
~/.mylogin.cnf | 用户登录路径相关,用于客户端 |
DATADIR/mysqld-auto.cnf | SET PERSIST 或 SE PERSIST_ONLY 设置的系统参数会保存到该文件 |