mysql的sql_mode合理设置

MySQL的sql_mode合理设置

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

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

NO_AUTO_VALUE_ON_ZERO:

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

STRICT_TRANS_TABLES:

在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE:

在严格模式下,不允许日期和月份为零

NO_ZERO_DATE:

设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_DIVISION_BY_ZERO:

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

NO_AUTO_CREATE_USER:

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

NO_ENGINE_SUBSTITUTION:

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

PIPES_AS_CONCAT:

将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES:

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

ORACLE的sql_mode设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.

如果使用mysql,为了继续保留大家使用oracle的习惯,可以对mysql的sql_mode设置如下

在my.cnf添加如下配置
[mysqld]
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-08-03 10:19:46

mysql的sql_mode合理设置的相关文章

MySQL不容忽视SQL_MODE的设置

CREATE DATABASE db_test; CREATE TABLE `tb1` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id', `rank` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排名', `add_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '当前时间', PRIMARY KEY

MySQL的sql_mode模式说明及设置

MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题. sql model 常用来解决下面几类问题 (1) 通过设置sql mode, 可以完成不同严格程度的数据校验,有效地保障数据准备性. (2) 通过设置sql model 为宽松模式,来保证大多数sql符合标准的sql语法,这样

MySQL的sql_mode解析与设置

https://blog.csdn.net/hhq163/article/details/54140286 https://blog.csdn.net/ccccalculator/article/details/70432123 升级mysql后,居然使用错误.更新时候提示timestamp类型错误,提示无默认值错误 原来是mysql提升了安全措施,原来的0000-00-00不被允许了,默认值也必须收购设置了 需要更改一下,但尚未找到快速更改的方法,只好先更改mysql设置了: 一.查看 sql

MySQL的SQL_MODE模式

1. sql_mode模式 mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode: mysql> select @@sql_mode; +----------------------------------------------------------------+ | @@sql_mode                                                  

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中为int设置长度究竟是什么意思

根据个人的实验并结合资料:1.长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关:2.长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值,在显示的时候怎么对齐呢?按照手册的说法,是默认用“空格”在左边填充.比如下述表格 CREATE TABLE `inttest` ( `id` int(3) unsigned NOT NULL AUTO_INCREMENT, `value` varchar(2) NOT NULL, PRIMARY KE

mysql的安装、C++访问mysql数据库、编码设置问题

一.mysql的安装,这个相对简单,直接去官网下载mysql安装程序,就可以完成安装过程,网上有很多安装教程,这个没什么注意事项. 二.C++访问mysql,主要是用到mysql定义的头文件,内部定义了各种数据结构和函数,比如MYSQL,MYSQL_RES,MYSQL_ROW,mysql_real_connect等等一系列的结构和函数.这里要注意的就是将头文件及lib文件以及dll文件配置到当前开发环境来进行访问mysql数据库. 以最新的vs2013作为示例说一下配置过程.为了写的清晰点,在网

如何设置mysql远程访问及防火墙设置

笔者在一个实际的项目中需要MYSQL远程访问. 情景: 安装好Mysql, 本地访问正常,很奇怪局域的机器都无法访问该服务器上的MYSQL数据库. 经过资料查找 原来Mysql默认是不可以通过远程机器访问的,通过下面的配置可以开启远程访问 . 在MySQL Server端: 登陆MYSQL   ..bin\ mysql -h localhost -u root -p 提示你输入密码,输入密码后进入 mysql 命令模式, mysql> use mysql;    mysql> GRANT AL

关于mysql的wait_timeout参数 设置不生效的问题【转】

关于wait_timeout 有一次去online set wait_timeout 的时候发现改了不生效,如下: mysql> show variables like 'wait_timeout';+---------------+-------+| Variable_name | Value |+---------------+-------+| wait_timeout | 100 |+---------------+-------+1 row in set (0.00 sec) mysq