一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串’  ’是相同的。这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的。NULL是指没有值,而”则表示值是存在的,只不过是个空值。对于SQL的新手,NULL值的概念常常会造成混淆,他们常认为NULL与MySQL空字符串是相同的事。情况并非如此。例如,下述语句是完全不同的:MySQL> INSERT INTO my_table (phone) VALUES (NULL);

mysql> INSERT INTO my_table (phone) VALUES ('');  
    这两条语句均会将值插入phone(电话)列,但第1条语句插入的是NULL值,第2条语句插入的是空字符串。第1种情况的含义可被解释为“电话号码未知”,而第2种情况的含义可被解释为“该人员没有电话,因此没有电话号码”。

为了进行NULL处理,可使用IS NULL和IS NOT NULL操作符以及IFNULL()函数。

对于聚合(累计)函数,如COUNT()、MIN()和SUM(),将忽略NULL值。对此的例外是COUNT(*),它将计数行而不是单独的列值。例如,下述语句产生两个计数。首先计数表中的行数,其次计数age列中的非NULL值数目:mysql> SELECT COUNT(*), COUNT(age) FROM person;  
对于某些列类型,MySQL将对NULL值进行特殊处理。如果将NULL插入TIMESTAMP列,将插入当前日期和时间。如果将NULL插入具有AUTO_INCREMENT属性的整数列,将插入序列中的下一个编号。另外''可以走索引,null走不了索引


MySQL的null与空字符串:

搞过Oracle的人,常常会对MySQL的null与空字符串''搞错。
在Oracle里:null 与 ''是等价的。

15:02:40 sql>create table test(v varchar2(10));
15:02:46 sql>insert into test values('');
15:03:07 sql>insert into test values(null);
15:03:12 sql>commit;
15:04:05 sql>select count(1) from test where v is null;
 COUNT(1)
----------
         2
15:04:07 sql>select count(1) from test where v ='';
  COUNT(1)
----------
         0

15:04:41 sql>select count(1) from test where v <>'';
  COUNT(1)
----------
         0         
注意:Oracle中null仅只能参与is null 和 is not null运算。如何使用 <> 、= 与null进行比较,都会返回false。

但在MySQL里,null与 ''是完全不同的:NULL是指没有值,而''则表示值是存在的,只不过是个空值。

见如下实验:
mysql> create table test (v varchar(10));
ERROR 1050 (42S01): Table 'test' already exists
mysql> drop table test;
Query OK, 0 rows affected (0.11 sec)

mysql> create table test (v varchar(10));
Query OK, 0 rows affected (0.11 sec)

mysql> insert into test values(null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into test values('');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+
| v    |
+------+
| NULL |
|      |
+------+
2 rows in set (0.00 sec)

mysql> select count(1) from test where v is null;
+----------+
| count(1) |
+----------+
|        1 |
+----------+
1 row in set (0.04 sec)

mysql> select count(1) from test where v = '';
+----------+
| count(1) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

再看看MySQL在时间类型字段上是如何处理null与''

mysql> create table t_date (d timestamp);
ERROR 1050 (42S01): Table 't_date' already exists
mysql> drop table t_date;
Query OK, 0 rows affected (0.12 sec)

mysql> create table t_date (d timestamp ,d2 datetime);
Query OK, 0 rows affected (0.14 sec)

mysql> insert into t_date values(null,null);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_date;
+---------------------+------+
| d                   | d2   |
+---------------------+------+
| 2014-02-19 15:42:11 | NULL |
+---------------------+------+
1 row in set (0.00 sec)

注:timestamp类型插入null,却插入了系统当前时间

mysql> desc t_date;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| d     | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| d2    | datetime  | YES  |     | NULL              |                             |
+-------+-----------+------+-----+-------------------+-----------------------------+

原来MySQL给自动给timestamp类型增加了默认值而不能为null。

mysql> insert into t_date (d) values ('');
ERROR 1292 (22007): Incorrect datetime value: '' for column 'd' at row 1
mysql> insert into t_date (d2) values ('');
ERROR 1292 (22007): Incorrect datetime value: '' for column 'd2' at row 1
时间字段不能插入''。

mysql> select @@version;
+------------------+
| @@version        |
+------------------+
| 5.6.14-ndb-7.3.3 |
+------------------+
1 row in set (0.00 sec)

不同版本的MySQL对时间字段的处理不一样,有的版本会把''转换为'0000-00-00 00:00:00'插入到表中。

而且相同版本不同的命令也可能不一样。

在我的实验中,使用load data 导入文本文件时,就发生了''转换为'0000-00-00 00:00:00'保存到表中。

附:
  使用load data进行导入数据的时候,没有数据的字段插入的不是null,而是'';为了能插入null,在文本文件中使用'\N'来代表null。

MySQL中NULL与空字符串的更多相关文章

  1. sql中null 和 ‘’(空字符串)

    sql 中 null  和 空字符串的区别方式 在Silverlight中  数据库 需要与实体类进行映射, 假如实体类不允许为null,则 select '' as 列名  from  表名字:   ...

  2. Django与SQL语言中——NULL与空字符串的区别

    SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, ...

  3. mysql 判断null 和 空字符串

    1.在mysql中null 不能使用任何运算符与其他字段或者变量(函数.存储过程)进行运算.若使用运算数据就可能会有问题. 2.对null 的判断: 创建一个user表:id 主健 name 可以为空 ...

  4. Oracle中Null与空字符串' '的区别

    含义解释: 问:什么是NULL? 答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零. ORACLE允许任何一种数据类型的字段为空,除 ...

  5. springboot中返回值json中null转换空字符串

    在实际项目中,我们难免会遇到一些无值.当我们转JSON时,不希望这些null出现,比如我们期望所有的null在转JSON时都变成“”“”这种空字符串,那怎么做呢? Jackson中对null的处理 @ ...

  6. 【转】oracle中的NULL、''(空字符串)以及'_'(空格)

    在Oracle中使用null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? 1.NULL和''(空字符串)是一个意思 注:为了便于区分空字符串和空格,下面的示例均以'_'代表空格. ...

  7. SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间

    SQLSERVER NULL和空字符串的区别 使用NULL是否节省空间 这里只讨论字符串类型,int.datetime.text这些数据类型就不讨论了,因为是否节省空间是根据数据类型来定的 在写这篇文 ...

  8. PHP递归方式把一个数组里面的null转换为空字符串”的方法

    在一些接口的调用中,直接查询数据库出来的字段可能为null字段,但是为了简便前端的判断,需要把null转换成空字符串'',这个时候就需要递归的方式进行.直接上代码如下: //递归方式把数组或字符串 n ...

  9. laravel之null替换空字符串中间件

    在laravel写接口的时候免不了数据库中保存null,可用诸如设置ORM的访问器或以下方法处理 $goods->name?$goods->name:''; 其实可以利用路由中间件,在需要 ...

随机推荐

  1. sqlAlchemy学习 001

    研究学习主题 sqlAlchemy架构图 测试练习代码编写 连接数据库 看代码 db_config = { 'host': 'xxx.xxx.xxx.xx', 'user': 'root', 'pas ...

  2. Xamarin.Android其他类型的服务

    一.前言 前面我们已经学了关于服务的很多知识,但是对于真实的开发那些远远不够,通过这节我们将学习其他类型的服务,比如前台服务.IntentService和消息服务.下面我们开始进入正题. 二.前台服务 ...

  3. Ubuntu14.04设置开机自启动脚本

    方法一.编辑rc.loacl脚本  Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本.在 exit 0 前面添加好脚本代码, ...

  4. Spring Cloud Edgware Release Notes

    Spring Cloud Edgware builds on Spring Boot 1.5.x. Renamed starters A number of starters did not foll ...

  5. JavaScript判断是否全为中文,是否含有中文

    来源于:http://blog.csdn.net/yenange/article/details/7463897 第一种代码(全为中文则返回"true",不全为中文则返回" ...

  6. (原)torch中提示Unwritable object <userdata> at <?>.callback.self.XXX.threads.__gc__

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6549432.html 参考网址: https://github.com/torch/threads/i ...

  7. 关于UDP-读这篇就够了(疑难杂症和使用)

    本文为转载文章 原文链接:https://www.qcloud.com/community/article/848077001486437077 版权归原文所有 关于UDP 面向报文的传输方式决定了U ...

  8. I/O事件处理模型之Reactor和Proactor 【转】

    http://blog.ddup.us/?p=280 这篇博客说的很清楚,赞一个: 在编写服务端软件的时候,如何处理各种I/O事件是其中很重要的一部分.在Unix Network Programmin ...

  9. 修改linux 最大文件限制数 ulimit

    1)修改当前交互终端的limit值 查询当前终端的文件句柄数: ulimit -n 回车,一般的系统默认的1024. 修改文件句柄数为65535,ulimit -n 65535.此时系统的文件句柄数为 ...

  10. MongoDB Linux环境安装及配置[转]

    CentOS 6.5系统中使用yum安装MongoDB 2.6 教程 CentOS 6.5系统中使用yum安装MongoDB 2.6 教程,本文共分5个步骤完成MongoDB的安装.下面我们在Cent ...