Mysql中空字符<''>和空值<null>的区别
2017-06-11 22:29
141 查看
一直都知道mysql中空字符串(”)和空值(null)之间有区别,但是没好好研究过。直到项目上,这两个概念被我搞混了之后才想起来研究一下。
根据网上的说法,空字符串(”)是不占用空间,而空值(null)是占用空间。(这里我不太明白,因为我的理解是,字符串都会有一个结束符,这个结束符不会占用空间吗??)。
虽然有不明白的地方,但是不影响这篇文章对这两个值的分析。
为了分析区别,这里新建一张表 test_null,并插入4行数据。
这里需要说一下,将字段设置为 not null之后是可以插入空字符(”)的。影响的只是不能插入空值(null)。
首先比较一下,空字符(”)和空值(null)查询方式的不同。
由此可见,null 和 ”的查询方式不同。而且比较字符 ‘=’’>’ ‘<’ ‘<>’是不能用于查询null。如果需要查询空值(null),需使用is null 和is not null。
第二种比较,参与运算。
由此可见,空值(null)是不能参与任何计算,因为空值参与任何计算都为空。所以,当程序业务中存在计算的时候,需要特别注意。如果非要参与计算,需使用ifnull函数,将null转换为”才能正常计算。
第三种比较,统计数量
由此可见,当统计数量的时候。空值(null)并不会被当成有效值去统计。同理,sum()求和的时候,null也不会被统计进来,这样就能理解,为什么null计算的时候结果为空,而sum()求和的时候结果正常了。
以上对比,算得上是程序中经常会遇到但又不容易注意的问题。
网络上,针对这两个值。有一种说法会比较好理解。在存电话号码字段中,空值(null)代表你没有电话,而空字符串(”)则代表,你有电话但是没有填写。或者理解,填写了又删除掉。
还有一种理解方式。null是尚未定义的值,表示未知。而”,确定为一个空字符串。所以未知的值,无法进行各种比较(大于,小于,等于),也不能用于计算(加减乘除)。
我的理解是,不考虑是否占用内存。null代表什么都没有,”代表的就是一个空白的字符串。所以,null什么都没有就不能用于比较。
无论怎么理解,都需要记住这两个值的区别。避免在项目中碰到错误。
根据网上的说法,空字符串(”)是不占用空间,而空值(null)是占用空间。(这里我不太明白,因为我的理解是,字符串都会有一个结束符,这个结束符不会占用空间吗??)。
虽然有不明白的地方,但是不影响这篇文章对这两个值的分析。
为了分析区别,这里新建一张表 test_null,并插入4行数据。
CREATE TABLE test_null ( id int, value_1 varchar(128), value_2 varchar(128) not null )
这里需要说一下,将字段设置为 not null之后是可以插入空字符(”)的。影响的只是不能插入空值(null)。
首先比较一下,空字符(”)和空值(null)查询方式的不同。
由此可见,null 和 ”的查询方式不同。而且比较字符 ‘=’’>’ ‘<’ ‘<>’是不能用于查询null。如果需要查询空值(null),需使用is null 和is not null。
第二种比较,参与运算。
由此可见,空值(null)是不能参与任何计算,因为空值参与任何计算都为空。所以,当程序业务中存在计算的时候,需要特别注意。如果非要参与计算,需使用ifnull函数,将null转换为”才能正常计算。
第三种比较,统计数量
由此可见,当统计数量的时候。空值(null)并不会被当成有效值去统计。同理,sum()求和的时候,null也不会被统计进来,这样就能理解,为什么null计算的时候结果为空,而sum()求和的时候结果正常了。
以上对比,算得上是程序中经常会遇到但又不容易注意的问题。
网络上,针对这两个值。有一种说法会比较好理解。在存电话号码字段中,空值(null)代表你没有电话,而空字符串(”)则代表,你有电话但是没有填写。或者理解,填写了又删除掉。
还有一种理解方式。null是尚未定义的值,表示未知。而”,确定为一个空字符串。所以未知的值,无法进行各种比较(大于,小于,等于),也不能用于计算(加减乘除)。
我的理解是,不考虑是否占用内存。null代表什么都没有,”代表的就是一个空白的字符串。所以,null什么都没有就不能用于比较。
无论怎么理解,都需要记住这两个值的区别。避免在项目中碰到错误。
相关文章推荐
- nil Nil null @"" 关于nil和 null和NSNull的区别及相关问题||(null) <null> nil 问题
- IOS (null)以及<null>的区别
- <% %>和<%# %>等的区别
- 简单的区别:<%#eval() %>和<%#bind() %>
- ASP.NET 几种< %%>用法 区别简介
- 页面标签<head></head>之间与<body></body>之间放JS有区别吗?
- C#Readonly, static, const 区别<转载>
- &lt;转&gt;android 中px,sp等的区别
- <context-param>与<init-param>的区别与作用
- C#中的[],Array,List<>,ArrayList的区别
- <% %>和<scripte runat="server">的区别
- 学习:<% %>和<%# %>等的区别(转)
- 关于List<T>中的Exists 和Contains的区别
- C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
- <jsp:include />和<%@ inclue %>之间的区别
- setInterval和setTimeout的使用区别(转自 <a href="http://www.cnblogs.com/sk-net/archive/2008/01/24/1050770.html">http://www.cnblogs.com/sk-net/archive/2008/01/24/1050770.html</a>)
- &lt;%!int n = 1 %&gt; 与&lt;%int n = 1 %&gt; 的区别
- C# IEnumerable<T>、IEnumerator<T>、List<T>、ArrayList、[]数组各各的区别
- 简单总结.NET中的各<% %>用法及区别
- C# 中 Struct 与 Class 的区别,以及两者的适用场合<转转转>