Mysql Mode

 

MySQL可以运行在不同的SQLMode(SQL模式)下。SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。

 

 

查询默认的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_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

ANSI 模式

 

create table nj(cc datetime);
set session sql_mode='ANSI';
insert into nj  values ('2019-13-221');

你发现这时候是可以插入的,但是数据的值就是0000-00-00 00:00:00

 

set session sql_mode='TRADITIONAL';
insert into t  values ('2019-13-221');
[22001][1292] Data truncation: Incorrect datetime value: '2019-13-221' for column 'cc' at row 1

换成 TRADITIONAL 模式之后发现插入报错了,因为 TRADITIONAL 是严格模式

 

 

 

插入的字符串 \被转换了

 

mysql> set session sql_mode='ANSI';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> create table t2(cc varchar(20));
Query OK, 0 rows affected (0.24 sec)
mysql> insert into t2  values ('\nanjing');
Query OK, 1 row affected (0.03 sec)
mysql> select * from t2;
+---------+
| cc      |
+---------+
| 
anjing |
+---------+
1 row in set (0.00 sec)

发现插入的字符串 \ 被干掉了, 是ANSI 模式下给你转义了

如果想原封不动的插入

set session sql_mode='NO_BACKSLASH_ESCAPES';
insert into t2  values ('\nanjing');
mysql> select * from t2;
+----------+
| cc       |
+----------+
|
anjing  |
| \nanjing |
+----------+
2 rows in set (0.01 sec)

启用NO_BACKSLASH_ESCAPES模式,使反斜线成为普通字符。在导入数据时,如果数据中含有反斜线字符,那么启用NO_BACKSLASH_ESCAPES模式保证数据的正确性,是个不错的选择。

 

 

在 ANSI模式下 || 还可以当拼接字符串使用

set session sql_mode ='ANSI';
select 'beijing' || 'nanjing';
beijingnanjing

 

 

常用Mode

 

ANSI

等同于 REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE  和ANSI 组合模式,这种模式使语法和行为更符合标准的SQL

STRICT_TRANS_TABLES

STRICT_TRANS_TABLES 适用于事物表和非事物表,它是严格模式,不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而不是警告

TRADITIONAL

TRADITIONAL模式等同于  STRCT_TRANS_TABLES,STRICT_ALL,NO__ZERO_IN_DATE,ERROR_FOR_DIVSION_BY_ZERO,TRADITIONAL 和NO_AUTO_CREATE_USER 组合模式,所以它也是严格模式,对于插入不正确的值给出错误而不是警告,可以应用在事物表和非事物表,用在事物时,出现错误就会立刻回滚

 

 

 

posted @ 2020-05-17 19:32  万隆  阅读(283)  评论(0编辑  收藏  举报