`
Sarah-Brightman
  • 浏览: 73370 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

详解mysql数据库sql_mode模式

阅读更多
今天在学习中遇到sql_mode这个东西,曾经一直没用过,查找相关文章先贴出来,以备后用。

mysql可以运行在不同sql mode模式下面,sql mode模式定义了mysql应该支持的sql语法,数据校验等!

查看默认的sql mode模式:
select @@sql_mode;
我的数据库是:
STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
在此模式下面,如果插入的数据的长度大于定义的长度,那么就会报错!

set session sql_mode='REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI';
在这种模式下面:插入的数据的长度大于定义的时候,就会截取,并警告,但是可以插入进去
session表示只在本次中有效
global:表示在本次连接中不生效,而对于新的连接就生效

启用NO_BACKSLASH_ESCAPES模式,使反斜线成为普通字符,在导入数据时候,如果数据中有反斜线,启用这个模式是个不错的选择

启用PIPES_AS_CNCAT模式,将||看成是普通字符串

常用的sql mode:
sql mode值 说明
ANSI: 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE和ANSI组合',这种模式使语法和行为更符合标准的sql
STRICT_TRANS_TABLES : 使用与事务和非事务表,严格模式
TRADITIONAL :也是严格模式,对于插入不正确的值给出错误而不是警告。用在事务时,只要发生错误就立即回滚

在Mysql5.0以下,默认的sql mode(sql mode参数)有:real_as_float,pipes_as_concat,ansi_quotes,gnore_space和ANSI。在这些模式下可以插入超过字段定义长度的数据,或是在字段中没有定义的元素数据(如,enum)。不过在插入后会有一个warning(可以用 show warnings来查看)。
在Mysql5.0以上版本中,有三种sql mode模式(ANSI、TRADITIONAL和STRICT_TRANS_TABLES(严格模式))可以用来解决以下问题:
(1). 通过设置不同的sql mode,可以在不同严格程序进行数据校验,有效地保证了数据准确性.
(2).通过设置sql mode为ANSI模式,来保证大多数SQL符合标准SQL的语法,这样在不同数据库之间迁移时,不需要对业务修改太多.
通过设置sql mode为STRICT_TRANS_TABLES(严格模式)来实现数据的严格校检,使错误数据不能插入,从而保证数据准确性。TRADITIONAL 模式也属于严格模式,同样可以实现严格校检,使错误数据不能插入,从而保证数据准确性。不过在这种模式MAX(X,0)返回的结果是NULL,所以在包含有MAX的运算中根据实际情况设定好sql mode.
ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。在某些情况下,ENUM值也可以为空字符串('')或NULL:如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通” 空字符串不同,该字符串有数值值0。
如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且 默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素。
(1)sql mode为ANSI
mysql> create table test(id bigint(20) auto_increment primary key, browsertype enum('ie','firefox','other'));
mysql> insert into test(browsertype) values('ie') ;
Query OK, 1 row affected (0.07 sec)
mysql> insert into test(browsertype) values('maxthon') ;
Query OK, 1 row affected (0.03 sec)
mysql> show warnings;(数据虽然成功insert,但有warning)
+---------+------+--------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------+
| Warning | 1265 | Data truncated for column 'browsertype' at row 1 |
+---------+------+--------------------------------------------------+
1 row in set (0.01 sec)
mysql> select * from test;
+----+-------------+
| id | browsertype |
+----+-------------+
| 1 | ie |
| 2 | |
+----+-------------+
2 rows in set (0.01 sec)
(2)使用严格模式(STRICT_TRANS_TABLES)
mysql> set session sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@sql_mode;
+---------------------+
| @@sql_mode |
+---------------------+
| STRICT_TRANS_TABLES |
+---------------------+
1 row in set (0.00 sec)
mysql> insert into test(browsertype) values('maxthon') ;
ERROR 1265: Data truncated for column 'browsertype' at row 1

mysql> insert into test(browsertype) values('firefox') ;
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+----+-------------+
| id | browsertype |
+----+-------------+
| 1 | ie |
| 2 | |
| 3 | firefox |
+----+-------------+
3 rows in set (0.00 sec)
(3) TRADITIONAL模式
mysql> create table t11 (i int);
Query OK, 0 rows affected (0.02 sec)
mysql> set sql_mode='ANSI';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t11 values(9%0);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t11;
+------+
| i |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
mysql> set sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t11 values(9%0);
ERROR 1365: Division by 0
mysql> show warnings;
+-------+------+---------------+
| Level | Code | Message |
+-------+------+---------------+
| Error | 1365 | Division by 0 |
+-------+------+---------------+
1 row in set (0.02 sec)
分享到:
评论

相关推荐

    mysql中的sql_mode模式实例详解

    本文实例讲述了mysql中的sql_mode模式。分享给大家供大家参考,具体如下: mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode:...

    关于MySQL的sql_mode合理设置详解

    MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也...

    MySQL中SQL Mode的查看与设置详解

    MySQL可以运行在不同的模式下,而且可以在不同的场景下运行不同的模式,这主要取决于系统变量 sql_mode 的值。本文主要介绍一下这个值的查看与设置,主要在Mac系统下。 对于每个模式的意义和作用,网上很容易找到,...

    Mysql之SQL Mode用法详解

    一、Mysql SQL Mode简介 通常来说MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式。这样,应用程序就能对服务器操作进行量身定制以满足自己的需求。这类模式定义了MySQL应支持...

    详解Mysql数据库date, datetime类型设置0000-00-00默认值(default)报错问题

    现象:MySQL5.7版本之后,date, datetime类型设置默认值”0000-00-00″,出现异常:Invalid default value for ‘time’ 原因:在命令行窗口查看当前的sql_mode配置: select @@sql_mode; 结果如下: ONLY_FULL_GROUP_BY...

    MySQL中slave_exec_mode参数详解

    今天无意当中看到参数slave_exec_mode,从手册里的说明看出该参数和MySQL复制相关,是可以动态修改的变量,默认是STRICT模式(严格模式),可选值有IDEMPOTENT模式(幂等模式)。设置成IDEMPOTENT模式可以让从库避免...

    docker 安装nacos并配置数据库的教程详解

    MySQL 5.7 (官方镜像不支持mysql8) nacos docker安装MySQL 创建自定义网络(用于容器通讯) docker network create common-network 查看网络 docker network ls 创建挂载文件夹 //mysql配置文件 mkdir -p /data/...

    mysql8.0.20下载安装及遇到的问题(图文详解)

    关于sql_mode,像下面这个报错,就是因为group by字段必须完全显示在查询列里,所以去掉这个模式,就不在报错了。 Caused by: java.sql.SQLSyntaxErrorException: Expression #13 of SELECT list is not in GROUP ...

    mysql 5.7.23 解压版安装教程图文详解

    下载mysql安装程序 官方下载地址:http://dev.mysql.com/downloads/mysql/ 解压下载文件,如图 其中data和my.ini文件需要自己创建 my.ini 文件配置如下: [client] ...sql_mode=NO_ENGINE_SUBSTITUTI

    MySQL模式 Strict Mode知识点详解

    根据 mysql5.0以上版本 strict mode (STRICT_TRANS_TABLES) 的限制: 1).不支持对not null字段插入null值 2).不支持对自增长字段插入”值,可插入null值 3).不支持 text 字段有默认值 看下面代码:(第一个字段为自增...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...

    MySQL使用TEXT/BLOB类型的知识点详解

    Strict Mode下不能设置默认值,否则会报can’t have a default value错: mysql> create table `test`.`text_blob`( -> `a_text` text DEFAULT ' ' , -> `b_blob` blob -> ); ERROR 1101 (42000): BLOB/TEXT ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    4.7 匹配节点的模式 111 4.8 mode属性 113 4.9 内置的模板规则 114 4.10 对空白的处理 115 4.11 xpath语言 116 4.11.1 xpath上下文 116 4.11.2 位置路径 117 4.11.3 表达式 121 4.11.4 核心函数库 123 4.12...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    4.7 匹配节点的模式 111 4.8 mode属性 113 4.9 内置的模板规则 114 4.10 对空白的处理 115 4.11 xpath语言 116 4.11.1 xpath上下文 116 4.11.2 位置路径 117 4.11.3 表达式 121 4.11.4 核心函数库 123 4.12...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    4.7 匹配节点的模式 111 4.8 mode属性 113 4.9 内置的模板规则 114 4.10 对空白的处理 115 4.11 xpath语言 116 4.11.1 xpath上下文 116 4.11.2 位置路径 117 4.11.3 表达式 121 4.11.4 核心函数库 123 4.12...

Global site tag (gtag.js) - Google Analytics