MySQL技巧--SQL MODE(Strict SQL Mode)

Posted 金桔乐园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL技巧--SQL MODE(Strict SQL Mode)相关的知识,希望对你有一定的参考价值。

 Strict SQL Mode:sql mode 模式



1. 查看当前SQL MODE模式及修改


mysql> show global variables like '%sql_mode%';

+---------------+---------------------+

| Variable_name | Value               |

+---------------+---------------------+

| sql_mode      | STRICT_TRANS_TABLES |

+---------------+---------------------+


开启与关闭Strict Mode方法

修改配置文件

找到mysql安装文件夹下的my.cnf(windows系统则是my.ini)文件

在sql_mode中增加STRICT_TRANS_TABLES则表示开启严格模式。如没有增加则表示非严格模式,改动后重新启动mysql就可以


动态修改(重启后失效)

mysql> set global sql_mode='STRICT_TRANS_TABLES';

Query OK, 0 rows affected (0.01 sec)




2.Strict Mode功能说明

不支持对not null字段插入null值

不支持对自增长字段插入”值

不支持text字段有默认值

 


3.样例:

创建数据表方便测试


CREATE TABLE `mytable` (

 `id` int(11) NOT NULL AUTO_INCREMENT,

 `name` varchar(20) NOT NULL,

 `content` text NOT NULL,

 PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

  


3.1.not null字段插入null值测试

插入一条记录,name的值为null


在非严格模式下运行


mysql> insert into mytable(content) values('programmer');

Query OK, 1 row affected, 1 warning (0.00 sec)

 

mysql> select * from mytable;

+----+------+------------+

| id | name | content    |

+----+------+------------+

|  1 |      | programmer |

+----+------+------------+

1 row in set (0.00 sec)

  


运行成功,name的值自己主动转为”

在严格模式下运行

mysql> insert into mytable(content) values('programmer');

ERROR 1364 (HY000): Field 'name' doesn't have a default value

运行失败,提示字段name不能为null值 



3.2.自增长字段插入”值测试

对id字段插入”值


在非严格模式下运行

mysql> insert into mytable(id,name,content) value('','fdipzone','programmer');

Query OK, 1 row affected, 1 warning (0.00 sec)

 

mysql> select * from mytable;

+----+----------+------------+

| id | name     | content    |

+----+----------+------------+

|  1 | fdipzone | programmer |

+----+----------+------------+

1 row in set (0.00 sec)

运行成功


在严格模式下运行

mysql> insert into mytable(id,name,content) value('','fdipzone','programmer');

ERROR 1366 (HY000): Incorrect integer value: '' for column 'id' at row 1

运行失败。提示字段id不能为”


mysql> insert into mytable(id,name,content) value(null,'fdipzone','programmer');

Query OK, 1 row affected (0.00 sec)

 

mysql> select * from mytable;

+----+----------+------------+

| id | name     | content    |

+----+----------+------------+

|  1 | fdipzone | programmer |

+----+----------+------------+

1 row in set (0.00 sec)

字段id为null则可运行成功 



3.3.text字段默认值测试

创建一个数据表mytable。当中text设置默认值default=”


在非严格模式下运行


mysql> CREATE TABLE `mytable` (

    ->  `id` int(11) NOT NULL AUTO_INCREMENT,

    ->  `name` varchar(20) NOT NULL,

    ->  `content` text NOT NULL default '',

    ->  PRIMARY KEY (`id`)

    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Query OK, 0 rows affected, 1 warning (0.03 sec)

 

mysql> show tables;

+------------------------------+

| Tables_in_test_version       |

+------------------------------+

| mytable                      |

+------------------------------+

运行成功


在严格模式下运行


mysql> CREATE TABLE `mytable` (

    ->  `id` int(11) NOT NULL AUTO_INCREMENT,

    ->  `name` varchar(20) NOT NULL,

    ->  `content` text NOT NULL default '',

    ->  PRIMARY KEY (`id`)

    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ERROR 1101 (42000): BLOB/TEXT column 'content' can't have a default value

  


运行失败,提示content字段是TEXT类型,不能使用默认值。


使用mysql严格模式能够使数据更加安全严格,缺点是降低了对空数据入库的兼容性。


以上是关于MySQL技巧--SQL MODE(Strict SQL Mode)的主要内容,如果未能解决你的问题,请参考以下文章

mysql 严格模式 Strict Mode说明

sql_mode :(STRICT_TRANS_TABLES与STRICT_ALL_TABLES 区别)

强制 sql_mode 为“STRICT_TRANS_TABLES”仍然收到警告 Django

mysql: [ERROR] unknown variable ‘sql-mode=STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,

如何开启MYSQL的严格模式

mysql启动失败(sql-mode)