一些刚刚接触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. SSH使用Log4j

    1. 将Jar文件log4j-1.2.14.jar导入项目. 2. 在src文件夹下新建log4j.properties文件: log4j.rootLogger = debug,stdout,D,E ...

  2. Redis问题MISCONF Redis is configured to save RDB snapshots....

    Redis问题MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on di ...

  3. Eclipse Java注释模板设置详解以及版权声明

    网上的Eclipse注释模板,在这里稍稍整理一些比较常用的. 编辑注释模板的方法:Window->Preference->Java->Code Style->Code Temp ...

  4. CUPS/Printer sharing

    https://wiki.archlinux.org/index.php/CUPS/Printer_sharing_(简体中文)   GNU/Linux系统间共享 在作为打印服务器的GNU/Linux ...

  5. 关于XCode更换项目名称

    1.打开项目直接修改项目名称 2.直接修改分组名 3.然后.command+B会报错 4.找到项目源文件 YourProject.xcodeproj  - > 右键显示包内容->找到pro ...

  6. 使用jQuery模拟鼠标点击a标签事件

    来源于:https://mo2g.com/view/42/ <html> <head> <meta charset="UTF-8"> <t ...

  7. Windows下node.js安装及环境配置

    1. 安装 官网下载node.js的安装版,一路next,中间可以自定义安装路径 完成后安装目录内容如下 cmd下检查是否安装成功 新版Node.js已自带npm,所以安装Node.js时会一起安装, ...

  8. java 下对字符串的格式化

    1.对整数进行格式化:%[index$][标识][最小宽度]转换方式         我们可以看到,格式化字符串由4部分组成,其中%[index$]的含义我们上面已经讲过,[最小宽度]的含义也很好理解 ...

  9. 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)

    原文: http://njm.iteye.com/blog/795881 --使用 自连接.for xml path('')和stuff合并显示多行数据到一行中 --注 --1.计算列可以不用包含在聚 ...

  10. elk架构图

    一.概述 笔者为了节约宝贵的服务器资源,把一些可拆分的服务合并在同一台主机.大家可以根据自己的实际业务环境自由拆分,延伸架构.