转:http://blog.youkuaiyun.com/itbuluoge/article/details/50836754
一、引子
在项目中遇到一个奇怪的问题,调用一个更新接口,接口要求对象的一个属性name值为空,就可以更新,但是如果不为空就不能更新。
然后在数据库里,手动把name字段的值清空了,但是调用后依然出错,于是乎开始进一步分析原因。
二、数据库结构
如图,其中name是可以为空的。
首先插入一条测试数据,SQL如下图所示
<span class="hljs-operator"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> student <span class="hljs-keyword">values</span>(<span class="hljs-keyword">null</span>,<span class="hljs-string">"jianghuiwen"</span>,<span class="hljs-number">100</span>);</span>
然后更新为空
<span class="hljs-operator"><span class="hljs-keyword">update</span> student <span class="hljs-keyword">set</span> name=<span class="hljs-string">""</span> <span class="hljs-keyword">where</span> id = <span class="hljs-number">103829</span>;</span>
查询后,显示如图所示
三、客户端测试
客户端采用的是java的代码,代码如图:
显示结果是:空。
继续更新为null:
<span class="hljs-operator"><span class="hljs-keyword">update</span> student <span class="hljs-keyword">set</span> name=<span class="hljs-keyword">null</span> <span class="hljs-keyword">where</span> id = <span class="hljs-number">103829</span>;</span>
继续运行测试,显示结果是:null。
四、接口问题
去寻找接口,发现接口写的是:
发现实际上接口只是做了null判断,而如果更新为”“的话,完全是两个不同的值。
所以,在业务逻辑中,要特别注意在mysql中的NULL和空,以及在JAVA代码中分别针对两种的判断。
五、小结
经过测试,当java使用对象插入到数据库的时候,如果某个字段不设置,不使用A.set()方法的话,插入的将是NULL值,而不是空值,空值需要使用A.set(“”)才会是空值,另外mysql中的null和NULL是同样的。