MySQL5.5 SQL_MODE

一:SQL_MODE的作用

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

二:SQL_MODE的模式

ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。

TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。

STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。

ANSI
    REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
TRADITIONAL
    STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

三:有效值

四:有效值说明

REAL_AS_FLOAT:将real视为float的同义词而不是double的同义词

PIPES_AS_CONCAT:将“||”视为字符串的联接操作符而非运算符,这个和oracle数据库是一样的,也和字符串的拼接函数concat相类似

ANSI_QUOTES:启用ANSI_QUOTES后,不能使用双引号来引用字符串,因为它将被解释为识别符

IGNORE_SPACE: 忽略函数名和括号之间的空格

STRICT_TRANS_TABLES:只对支持事务的表启用严格模式

STRICT_ALL_TABLES:对所有引擎的表都启用严格模式

NO_ZERO_DATE: 在非严格模式下,可以插入形如“00-00-0000:00:00”的非法日期,mysql仅抛出一个警告,而启用该选项后,mysql不允许插入零日期,插入0日期会抛出错误而非警告

NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零:采用日期和月份为零的格式时mysql会直接抛出错误而非警告

ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

ONLY_FULL_GROUP_BY:对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了

ALLOWS_INVALID_DATES:该选项并不完全对日期的合法性进行检查,只检查月份是否在1-12之间,日期是否在1-31之间。该模式仅对date和datetime类型有效,而对timestamp无效,因为timestamp总是要求一个合法的输入

NO_BACKSLASH_ESCAPES:反斜杠“\”作为普通字符而非转义字符

NO_DIR_IN_CREATE:在创建表时忽视所有INDEXDIRETORY和DATA DIRECTORY的选项

NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或者未编译,那么抛出错误

NO_UNSIGNED_SUBSTITUTION:启用这个选项后,两个UNSIGNED类型相减返回SIGNED类型

五:合理设置

SET SQL_MODE=‘ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES‘;
时间: 2024-07-29 02:27:02

MySQL5.5 SQL_MODE的相关文章

MySQL5.5 SQL_MODE设置

一:SQL_MODE的作用 SQL_MODE是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题 二:SQL_MODE包含的模式 ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告. TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验

mysql5.6 sql_mode设置为宽松模式

最近遇到一个很奇怪的事情 由于数据人员的需求,现在需要修改mysql的sql_mode sql_mode默认是sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 这时候我在/etc/my.cnf配置如下 sql_mode=NO_ENGINE_SUBSTITUTION 重启后还是 mysql> SELECT @@GLOBAL.sql_mode;+--------------------------------------------+| @@GL

mysql5.6.20数据库sql_mode模式设置

开发需求要求通过php后台程序导入数据到mysql的某个库的表中,但是报错:Incorrect integer value: '' for column 'id' at row 1.同时自己在mysql5.6的数据库的这个表中insert into 一条数据,insert into log values('','admin','31','002t'),还是报错出现上面同样的错误. 于是网上百度找到解决办法: 参考资料:http://blog.csdn.net/j2eelamp/article/d

MySQL 5.7 学习:安全相关特性

背景: 继上次介绍 初识 MySQL 5.6 新功能.参数完之后,刚好MySQL 5.7又GA了,在官方测试里看到,MySQL5.7在功能.性能.可用性.安全和监控上又提升了很高.现在看看和MySQL5.6对比,新增参数可以看上一篇文章,本文来说明MySQL5.7关于账号安全方面的新特性:(后续持续更新) 1,账号安全相关的特性  1.1:创建用户 5.7版本的用户表mysql.user要求plugin字段非空,且默认值是mysql_native_password认证插件,并且不再支持mysql

sql_mode=ONLY_FULL_GROUP_BY 导致lepus监控mysql5.7报错

lepus监控mysql5.7出现的问题: 2017-09-12 12:18:53 [INFO] check mysql controller finished. [WARNING] check mysql 192.168.10.9:3306 failure: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'information_schema.proce

mysql5.7和mysql5.6默认的sql_mode说明

一.场景: 最近在部署新的项目,开发要求把原先旧项目的MySQL数据导入到新项目MySQL5.7的数据库上.(旧项目上运行的是mysql5.6)不就是导入数据嘛,也没多想,那就导入呗.导入时,开始报错了,报错如下:MySQL 5.7 ERROR 1067 (42000): Invalid default value for 'CREATE_TIME'MySQL 5.7 ERROR 1067 (42000): Invalid default value for 'day'简单google了下,发现

MYSQL5.7版本sql_mode=only_full_group_by问题

具体出错提示: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode

mysql5.7 gruop by报错this is incompatible with sql_mode=only_full_group_by

解析:在mysql 工具 搜索或者插入数据时报下面错误: ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'database_tl.emp.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible wit

CentOS6.5编译安装MySQL5.5

安装依赖包: yum -y install gcc* gcc-c++* autoconf* automake* zlib* libxml* ncurses-devel* libgcrypt* libtool* 安装cmake: [[email protected] usr]# wget http://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz [[email protected] usr]# tar xzvf cmake-2.8.12.tar.gz