文档章节

Mysql的SQL模式

kenyon_君羊
 kenyon_君羊
发布于 2015/06/23 23:16
字数 600
阅读 584
收藏 16
Mysql在5.6版本以后默认的SQL模式是STRICT_TRANS_TABLES,对数据的严谨性和一致性上比之前版本要有所提升。


一、查看当前sql模式

mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
二、指定模式
5.6以后默认的my.cnf文件里模式配置是sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,所以启动指定这个配置文件时会自动带上这两个参数值
第一个参数值NO_ENGINE_SUBSTITUTION,是指不支持engine的sql将会报错,支不支持engin可以show engines查看 第二个参数值STRICT_TRANS_TABLES,是指当前会话的严格模式,区别于以往的空,即不严格的模式 
还有其他有意思的参数,如no_auto_create_user等,可以参考官网

三、示例
1.在严格的模式下
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

mysql> create table tbl_kenyon(id int null,vname varchar(6));
Query OK, 0 rows affected (0.12 sec)

mysql> insert into tbl_kenyon values(1,'123456');
Query OK, 1 row affected (0.00 sec)

mysql> insert into tbl_kenyon values(1,'1234567');
ERROR 1406 (22001): Data too long for column 'vname' at row 1
mysql> insert into tbl_kenyon values('','123456');
ERROR 1366 (HY000): Incorrect integer value: '' for column 'id' at row 1
mysql> insert into tbl_kenyon values(null,'123456');
Query OK, 1 row affected (0.01 sec)

mysql> select * from tbl_kenyon;
+------+--------+
| id   | vname  |
+------+--------+
|    1 | 123456 |
| NULL | 123456 |
+------+--------+
2 rows in set (0.00 sec)
2.在非严格的模式下
mysql> set @@sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|            |
+------------+
1 row in set (0.00 sec)

mysql> insert into tbl_kenyon values(99,'123456');
Query OK, 1 row affected (0.00 sec)

mysql> insert into tbl_kenyon values(1,'1234567');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into tbl_kenyon values('','123456');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+------------------------------------------------------+
| Level   | Code | Message                                              |
+---------+------+------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column 'id' at row 1 |
+---------+------+------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from tbl_kenyon;
+------+--------+
| id   | vname  |
+------+--------+
|    1 | 123456 |
| NULL | 123456 |
|   99 | 123456 |
|    1 | 123456 |
|    0 | 123456 |
+------+--------+
5 rows in set (0.00 sec)
四、 应用场景
两种模式各有利弊,通常生产上会设置严格模式,可以保证数据的完整性;
非严格模式并不一定就是差的,在数据一致性要求不严的场景下某些忽略警告操作可能更方便,比如不同版本数据库的非关键数据导入:
mysql> load data infile '/data/source_data/trace/tbl_msg.sql' into table tbl_msg;
ERROR 1366 (HY000): Incorrect integer value: 'NULL' for column 'pid' at row 1

换个模式导入:
mysql> set @@session.sql_mode='';
Query OK, 0 rows affected (0.00 sec)

mysql> load data infile '/data/source_data/trace/ tbl_msg.sql' into table tbl_msg;
Query OK, 23525 rows affected, 65535 warnings (2.80 sec)
Records: 23525 Deleted: 0 Skipped: 0 Warnings: 185707

五、参考:
https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html

© 著作权归作者所有

共有 人打赏支持
kenyon_君羊
粉丝 499
博文 170
码字总数 121714
作品 0
杭州
其他
私信 提问
加载中

评论(2)

kenyon_君羊
kenyon_君羊

引用来自“mark35”的评论

随着mysql在规范化、数据一致化上的提升,其速度也会越来越慢
mysql功能也是越来越丰富,速度还是要看场景。pg也一样,保证功能丰富的同时,速度越来越快。软件总是有趋同性的。
mark35
mark35
随着mysql在规范化、数据一致化上的提升,其速度也会越来越慢
MySQL 服务器的 SQL 模式

MySQL 服务器的 SQL 模式 MySQL 服务器有一个名为 sql_mode 的系统变量可以让你调控其 SQL 模式,SQL 模式对 SQL 语句的执行情况有多方面的影响。 SQL 模式: STRICTALLTABLES 和 STRICTTRAN...

TinyDolphin
2018/01/04
0
0
服务器SQL模式--记一次工作中遇到的问题

在迁移一个老项目的时候碰到的问题。因为平时运行稳定,没什么问题,也太关注。这次迁移后测试,服务器报错:[Err] 1364 - Field 'content' doesn't have a default value。 觉得很奇怪,为什...

xtceetg
2018/06/28
0
0
MySQL下bin-log的三种模式(ROW、Statement、Mixed)

MySQL的bin-log日志备份有三种模式,分别是:ROW、Statement、Mixed 一、Row 基于行的复制(row-based replication,RBR) 日志中会记录成每一行数据被修改成的形式,然后在slave端再对相同的数...

90xa
2016/03/25
1K
0
Docker实现Mysql8主从配置

Docker实现Mysql8主从配置 [注:运行环境为centos 7] 1 使用docker下载mysql镜像,默认下载最mysql最新版本,目前版本号为8.0.13,如果需要其他版本请登录https://hub.docker.com/进行搜索 [r...

halbin
2018/10/31
0
0
SQL服务器模式

服务器可以以不同的模式来操作,并且可以为不同客户端应用不同模式。这样每个应用程序可以根据自己的需求来定制的操作模式。 模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查。...

技术小胖子
2017/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
34分钟前
1
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
39分钟前
0
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
2
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
2
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部