[实践OK]Mysql严格模式开启打开插入宽松模式, MySQL 严格模式 sql_mode,最主要是innodb的严格模式备查。mysql STRICT_TRANS_TABLES严格模式下提示Field 'id' doesn't have a default value。

jackxiang 2013-11-14 20:00 | |
STRICT_TRANS_TABLES:https://www.cnblogs.com/lxwphp/p/9054971.html
#sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION



背景:线上数据库报:mysql STRICT_TRANS_TABLES严格模式下提示Field 'ip' doesn't have a default value,线下测试机没有报错,外包开发时代码没法保证SQL全写运行无问题。
failed to execute the SQL statement:
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect
datetime value: '0000-00-00 00:00:00' for column 'updated_at' at row 1
如果想宽松模式,则注意一下修改一下sql_mode,如下:


这样干的问题:


INNODB加入后,还是不行:
innodb_strict_mode = 1
mysql> show variables  like "%str%";
+--------------------+----------------+
| Variable_name      | Value   |
+--------------------+----------------+
| innodb_strict_mode | ON    |
+--------------------+----------------+
1 row in set (0.00 sec)

外网的SQL有问题,内网的测试机db无问题,如下:
REPLACE INTO `app_play_8` (`user_id`, `video_id`, `video_name`, `video_img`, `video_url`, `playtime`, `source`, `source_url`, `clienttype`, `position`) VALUES ('21240168', '112c9654-52ed-11e1-b091-a4badb4696b6', '《2012春节动画狂欢曲》', 'http://p1.img.cctvpic.com/fmspic/2012/02/06/becd73c6cc3f43c59add0f42787400ae-180.jpg', 'http://jackxiang.com/v-112c9654-52ed-11e1-b091-a4badb4696b6.html', 1388978166, '哈妮哈妮', 'http://my.jackxiang.com/31759585/index.html', '1', '99')

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


看似找到了,其实不然,和版本无关---另一台测试的db是13的,也是同样ip不能为空,但也不提示:Field 'ip' doesn't have a default value。
找到了:
这个我在我的虚拟机mysql5.6.12 上分别把线上的sql给建立和线下也建立,同时这个+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_strict_mode | OFF   |
+--------------------+-------+,
虚拟机是会报没有ip的,所以,得出是mysql的版本造成的。5.6.11(测试),5.6.12(我的虚拟机),5.6.13线上。 12,13是一样的结果,得证。
我这个关系不大:innodb_strict_mode
尽管线上打开了,但是我的虚拟机配置没打开这个,依旧能提示:Field 'ip' doesn't have a default value。

______后来,1)打开my.ini,加入:
#Add Mysql's Innodb strict sql insert mode by:jackxiang date:2013-01-06

2)重启:
[root@localhost mysql]# ./bin/mysqld_safe --defaults-file=conf/my.cnf &
3)再插入OK有提示了:
mysql> REPLACE INTO `app_play_8` (`user_id`, `video_id`, `video_name`, `video_img`, `video_url`, `playtime`, `source`, `source_url`, `clienttype`, `position`) VALUES ('21240168', '112c9654-52ed-11e1-b091-a4badb4696b6', '《2012春节动画狂欢曲》', 'http://p1.img.cctvpic.com/fmspic/2012/02/06/becd73c6cc3f43c59add0f42787400ae-180.jpg', 'http://jackxiang.com/v-112c9654-52ed-11e1-b091-a4badb4696b6.html', 1388978166, '哈妮哈妮', 'http://my.jackxiang.com/31759585/index.html', '1', '99');
ERROR 1364 (HY000): Field 'ip' doesn't have a default value
mysql> quit


实践参考两篇文章:
mysql STRICT_TRANS_TABLES严格模式下提示Field 'id' doesn't have a default value:
http://www.zui88.com/blog/view-411.html
Mysql Field * doesn't have a default value解决方法:
http://blog.sina.com.cn/s/blog_43ed7f260100fk6h.html

EOF Add:2014-01-06
——————————————————————————————————————————————————————————————
虽然说我们尽量在写程序的时候控制插入到数据库的数据,而不要用数据库去判断数据的对错,但是有时候为了方便还是需要数据库自身的容错能力来帮助我们达到目的的。举例说明:
创建如下数据表
[sql] view plaincopy
    CREATE TABLE `book` (  
      `id` int(11) default NULL,  
      `num` int(11) unsigned default NULL  
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk  
    insert into bookvalues(1,0),(2,0)  
执行update book set num='abc',竟然不报错,原因是没有启用严格模式。所以
先执行set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",
然后执行update book set num='abc',数据库就报错了
如果想一劳永逸,那就直接把数据库配置文件my.ini中的相关参数设置为
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
——————————————————————————————————————————————————————————————

解决办法:关闭MySQL的strict mode。具体做法:找到MySQL目录下的my.ini,
将其中的sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
修改为sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",重新启动 Mysql服务。


  MySQL 严格模式 sql_mode 收藏
虽然说我们尽量在写程序的时候控制插入到数据库的数据,而不要用数据库去判断数据的对错,但是有时候为了方便还是需要数据库自身的容错能力来帮助我们达到目的的。举例说明:
创建如下数据表
CREATE TABLE `book` (
  `id` int(11) default NULL,
  `num` int(11) unsigned default NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
insert into bookvalues(1,0),(2,0)
执行update book set num='abc',竟然不报错,原因是没有启用严格模式。所以
先执行set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",
然后执行update book set num='abc',数据库就报错了


非严格模式:会对语法的限制降到最低,导致很多不规范的语句都可以执行,会导致歧义.
严格模式:可以实现严格校检,使错误数据不能插入,从而保证数据准确性.

来自:http://blog.sina.com.cn/s/blog_505d197c0100l1bs.html
来自:http://blog.csdn.net/ldb2741/article/details/5317803
官网:http://forums.mysql.com/read.php?11,581356,581356#msg-581356

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/6810/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2019-5-7 18:41
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]