<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]Mysql严格模式开启打开插入宽松模式， MySQL 严格模式 sql_mode,最主要是innodb的严格模式备查。mysql STRICT_TRANS_TABLES严格模式下提示Field id doesnt have a default value。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Thu, 14 Nov 2013 12:00:32 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	STRICT_TRANS_TABLES:<a href="https://www.cnblogs.com/lxwphp/p/9054971.html" target="_blank">https://www.cnblogs.com/lxwphp/p/9054971.html</a><br/>#sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION<br/>sql_mode=ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION<br/><br/><textarea name="code" class="php" rows="15" cols="100">
打开my.ini，查找

sql-mode=&quot;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;

修改为

sql-mode=&quot;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;

然后重启MYSQL
</textarea><br/><br/>背景：线上数据库报：mysql STRICT_TRANS_TABLES严格模式下提示Field &#039;ip&#039; doesn&#039;t have a default value，线下测试机没有报错，外包开发时代码没法保证SQL全写运行无问题。<br/>failed to execute the SQL statement:<br/>SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect<br/>datetime value: &#039;0000-00-00 00:00:00&#039; for column &#039;updated_at&#039; at row 1<br/>如果想宽松模式，则注意一下修改一下sql_mode,如下:<br/><textarea name="code" class="php" rows="15" cols="100">
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
</textarea><br/><br/>这样干的问题：<br/><textarea name="code" class="php" rows="15" cols="100">
mysql新版本的在 STRICT_TRANS_TABLES严格模式下，就是防止写代码时把一些值忽略写入而严格对代码的入库规范 ，现因开发和产品要求放开严格模式：

[mysqld]&nbsp;&nbsp;sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

已知会外包开发能改的尽量改，不然安全和数据库 team 审核代码后发现会很麻烦，也会要求强制整改的。 

</textarea><br/><br/>INNODB加入后，还是不行：<br/>innodb_strict_mode = 1<br/>mysql&gt; show variables&nbsp;&nbsp;like &quot;%str%&quot;;<br/>+--------------------+----------------+<br/>&#124; Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; Value&nbsp;&nbsp; &#124;<br/>+--------------------+----------------+<br/>&#124; innodb_strict_mode &#124; ON&nbsp;&nbsp;&nbsp;&nbsp;&#124; <br/>+--------------------+----------------+<br/>1 row in set (0.00 sec)<br/><br/>外网的SQL有问题，内网的测试机db无问题，如下:<br/>REPLACE INTO `app_play_8` (`user_id`, `video_id`, `video_name`, `video_img`, `video_url`, `playtime`, `source`, `source_url`, `clienttype`, `position`) VALUES (&#039;21240168&#039;, &#039;112c9654-52ed-11e1-b091-a4badb4696b6&#039;, &#039;《2012春节动画狂欢曲》&#039;, &#039;http://p1.img.cctvpic.com/fmspic/2012/02/06/becd73c6cc3f43c59add0f42787400ae-180.jpg&#039;, &#039;http://jackxiang.com/v-112c9654-52ed-11e1-b091-a4badb4696b6.html&#039;, 1388978166, &#039;哈妮哈妮&#039;, &#039;http://my.jackxiang.com/31759585/index.html&#039;, &#039;1&#039;, &#039;99&#039;)<br/><br/>ERROR 1364 (HY000): Field &#039;ip&#039; doesn&#039;t have a default value<br/><br/><br/>看似找到了，其实不然，和版本无关---另一台测试的db是13的，也是同样ip不能为空，但也不提示：Field &#039;ip&#039; doesn&#039;t have a default value。<br/>找到了：<br/>这个我在我的虚拟机mysql5.6.12 上分别把线上的sql给建立和线下也建立，同时这个+--------------------+-------+<br/>&#124; Variable_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; Value &#124;<br/>+--------------------+-------+<br/>&#124; innodb_strict_mode &#124; OFF&nbsp;&nbsp; &#124;<br/>+--------------------+-------+，<br/>虚拟机是会报没有ip的，所以，得出是mysql的版本造成的。5.6.11（测试），5.6.12（我的虚拟机），5.6.13线上。 12，13是一样的结果，得证。<br/>我这个关系不大：innodb_strict_mode<br/>尽管线上打开了，但是我的虚拟机配置没打开这个，依旧能提示：Field &#039;ip&#039; doesn&#039;t have a default value。<br/><br/>______后来，1）打开my.ini，加入：<br/>#Add Mysql&#039;s Innodb strict sql insert mode by:jackxiang date:2013-01-06<br/><textarea name="code" class="php" rows="15" cols="100">
sql-mode=&quot;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;
innodb_strict_mode = 1
</textarea><br/>2）重启：<br/>[root@localhost mysql]# ./bin/mysqld_safe --defaults-file=conf/my.cnf &amp;<br/>3）再插入OK有提示了：<br/>mysql&gt; REPLACE INTO `app_play_8` (`user_id`, `video_id`, `video_name`, `video_img`, `video_url`, `playtime`, `source`, `source_url`, `clienttype`, `position`) VALUES (&#039;21240168&#039;, &#039;112c9654-52ed-11e1-b091-a4badb4696b6&#039;, &#039;《2012春节动画狂欢曲》&#039;, &#039;http://p1.img.cctvpic.com/fmspic/2012/02/06/becd73c6cc3f43c59add0f42787400ae-180.jpg&#039;, &#039;http://jackxiang.com/v-112c9654-52ed-11e1-b091-a4badb4696b6.html&#039;, 1388978166, &#039;哈妮哈妮&#039;, &#039;http://my.jackxiang.com/31759585/index.html&#039;, &#039;1&#039;, &#039;99&#039;);<br/>ERROR 1364 (HY000): Field &#039;ip&#039; doesn&#039;t have a default value<br/>mysql&gt; quit<br/><br/><br/>实践参考两篇文章：<br/>mysql STRICT_TRANS_TABLES严格模式下提示Field &#039;id&#039; doesn&#039;t have a default value：<br/>http://www.zui88.com/blog/view-411.html<br/>Mysql Field * doesn&#039;t have a default value解决方法：<br/>http://blog.sina.com.cn/s/blog_43ed7f260100fk6h.html<br/><br/>EOF Add:2014-01-06<br/>——————————————————————————————————————————————————————————————<br/>虽然说我们尽量在写程序的时候控制插入到数据库的数据，而不要用数据库去判断数据的对错，但是有时候为了方便还是需要数据库自身的容错能力来帮助我们达到目的的。举例说明：<br/>创建如下数据表<br/>[sql] view plaincopy<br/>&nbsp;&nbsp;&nbsp;&nbsp;CREATE TABLE `book` (&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`id` int(11) default NULL,&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`num` int(11) unsigned default NULL&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;) ENGINE=InnoDB DEFAULT CHARSET=gbk&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;insert into bookvalues(1,0),(2,0)&nbsp;&nbsp;<br/>执行update book set num=&#039;abc&#039;，竟然不报错，原因是没有启用严格模式。所以<br/>先执行set sql_mode=&quot;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;,<br/>然后执行update book set num=&#039;abc&#039;，数据库就报错了<br/>如果想一劳永逸，那就直接把数据库配置文件my.ini中的相关参数设置为<br/># Set the SQL mode to strict<br/>sql-mode=&quot;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;<br/>——————————————————————————————————————————————————————————————<br/><br/>解决办法：关闭MySQL的strict mode。具体做法：找到MySQL目录下的my.ini，<br/> 将其中的sql-mode=&quot;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;<br/> 修改为sql-mode=&quot;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;，重新启动 Mysql服务。<br/> <br/> <br/>&nbsp;&nbsp;MySQL 严格模式 sql_mode 收藏<br/>虽然说我们尽量在写程序的时候控制插入到数据库的数据，而不要用数据库去判断数据的对错，但是有时候为了方便还是需要数据库自身的容错能力来帮助我们达到目的的。举例说明：<br/>创建如下数据表<br/>CREATE TABLE `book` (<br/>&nbsp;&nbsp;`id` int(11) default NULL,<br/>&nbsp;&nbsp;`num` int(11) unsigned default NULL<br/>) ENGINE=InnoDB DEFAULT CHARSET=gbk<br/>insert into bookvalues(1,0),(2,0)<br/>执行update book set num=&#039;abc&#039;，竟然不报错，原因是没有启用严格模式。所以<br/>先执行set sql_mode=&quot;STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&quot;,<br/>然后执行update book set num=&#039;abc&#039;，数据库就报错了<br/> <br/> <br/>非严格模式:会对语法的限制降到最低，导致很多不规范的语句都可以执行，会导致歧义.<br/>严格模式:可以实现严格校检,使错误数据不能插入，从而保证数据准确性.<br/><br/>来自：http://blog.sina.com.cn/s/blog_505d197c0100l1bs.html<br/>来自：http://blog.csdn.net/ldb2741/article/details/5317803<br/>官网：http://forums.mysql.com/read.php?11,581356,581356#msg-581356
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]Mysql严格模式开启打开插入宽松模式， MySQL 严格模式 sql_mode,最主要是innodb的严格模式备查。mysql STRICT_TRANS_TABLES严格模式下提示Field id doesnt have a default value。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>