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 (' anjing'); 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 (' anjing'); mysql> select * from t2; +----------+ | cc | +----------+ | anjing | | anjing | +----------+ 2 rows in set (0.01 sec)
启用NO_BACKSLASH_ESCAPES模式,使反斜线成为普通字符。在导入数据时,如果数据中含有反斜线字符,那么启用NO_BACKSLASH_ESCAPES模式保证数据的正确性,是个不错的选择。
在 ANSI模式下 || 还可以当拼接字符串使用
set session sql_mode ='ANSI'; select 'beijing' || 'nanjing'; beijingnanjing
常用Mode