MySQL中NULL与空字符串 空格问题

   一些刚刚接触MySQL的孩子,经常会错误的认为NULL与空字符串' '是相同的。这看似是一件不重要的事情,但是在MySQL中,这两者是完全不同的。NULL是指没有值,而''则表示值是存在的,只不过是个空值。。

  这就相当于厂子给职工分房子,一共只有一套,老张和老李都想要,可是经理告诉老张,下次有您的房子,可是老李压根就没人搭理他。所以老张的房子是"空"的,因为这是空白支票,不过毕竟经理张口了,而老李的房子就是NULL的,因为根本就没有人考虑过他。

  二者的区别不大,但是如果不仔细的话可能会使我们限入困境。因为在PRIMARY KEY字段中是不能使用NULL值的。这一点我们应该记住哈。

  首先创建一个表:create table ceshi(ID INT ,createDate TimesTamp );

  包含2个字段,id为int类型,createDate为TimesTamp类型,现在往这个表中插入一条数据,其中createDate类型插入一个空值null;

  语句: insert into ceshi values(001,null);

  代码如下

  mysql> insert into ceshi values(001,null);

  Query OK, 1 row affected (0.01 sec)

  插入成功了,现在来查询下这个表中的记录,查看结果如下:

  代码如下

  mysql> select * from ceshi;

  +------+---------------------+

  | ID | createDate |

  +------+---------------------+

  | 1 | 2012-10-08 06:12:34 |

  +------+---------------------+

  1 row in set (0.01 sec)

  我明明插入的是一条空值null,为什么在显示的时候是显示系统当前时间呢?那再试试直接插入空字符串呢?

  代码如下

  mysql> insert into ceshi values(002,'');

  Query OK, 1 row affected, 1 warning (0.00 sec)

  mysql> select * from ceshi;

  +------+---------------------+

  | ID | createDate |

  +------+---------------------+

  | 1 | 2012-10-08 06:12:34 |

  | 2 | 0000-00-00 00:00:00 |

  +------+---------------------+

  2 rows in set (0.00 sec)

  显示的不是系统当前时间,而是0000-00-00 00:00:00。

  那如果字段不是时间类型而是varchar类型,结果又会不会也是一样呢,更改表结构,增加字段name varchar(10),同时插入一条数据:

  代码如下

  mysql> insert into ceshi values(003,null,null);

  Query OK, 1 row affected (0.01 sec)

  mysql> select * from ceshi;

  +------+---------------------+------+

  | ID | createDate | name |

  +------+---------------------+------+

  | 1 | 2012-10-08 06:12:34 | NULL |

  | 2 | 0000-00-00 00:00:00 | NULL |

  | 3 | 2012-10-08 06:22:12 | NULL |

  +------+---------------------+------+

  3 rows in set (0.00 sec)

  增加了null值,再往字段中插入''空字符串:

  代码如下

  mysql> insert into ceshi(name) values('');

  Query OK, 1 row affected (0.01 sec)

  mysql> select * from ceshi;

  +------+---------------------+------+

  | ID | createDate | name |

  +------+---------------------+------+

  | 1 | 2012-10-08 06:12:34 | NULL |

  | 2 | 0000-00-00 00:00:00 | NULL |

  | 3 | 2012-10-08 06:22:12 | NULL |

  | NULL | 2012-10-08 06:23:01 | |

  +------+---------------------+------+

  4 rows in set (0.01 sec)

  看着好似插入的都没有问题,但是我们去统计name的数据量时候,这个时候又有问题了:

  代码如下

  mysql> select count(name) from ceshi;

  +-------------+

  | count(name) |

  +-------------+

  | 1 |

  +-------------+

  1 row in set (0.00 sec)

  简单的说 空字符串==空字符串; 是ture 而 NULL == NULL 是false;

  NULL是什么都没有的意思。空毕竟是空~还是有东西只是它的这个东西是"空"

  在mssql中执行下面语句:

  print null+'Null有值吗?';

  print "+'空串有值吗?';

时间: 2024-11-10 01:17:24

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种情况的含义可被解释为

Access 2003 中 null 和 '' 空字符串的奇怪问题

最近系统运行中发现Access 2003 版本中对待 Null 和 '' (空字符)奇怪问题,重现步骤: 1.创建表tabTest : 2.使用设计视图添加两个字段 ID ,col1 名称 类型 长度 说明 ID Number     主键,自增 Col1 char 1 无             3.使用sql 添加如下数据 -- col1 字段设置为 null INSERT INTO tabtest (id, col1) VALUES(1, NULL); -- col1 字段设置为 '' I

MySQL中NULL字段的比较问题

最近有人问我MySQL中一个字段不论=NULL还是<>NULL都匹配不了数据,是在框架层实现的还是在存储引擎层实现的,我说你看看如果InnoDB表和MyISAM表都有这个现象,那就比较可能是在框架层. 当然这个答案跟没有回答一样,我们可以从代码上看看具体的实现部分. 1. 现象描述 表结构 CREATE TABLE `t` ( `c` char(32) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=gbk 插入两行数据 insert into t (

php setcookie时值为null或空字符串(删除cookie)

长久以来,在php中删除cookie的时候,都是使用 bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] ) $value 随便写, $expire设置为一个已经过去的时间即可. 官方文档中也是这样写的: http://www.php.n

Mysql中NULL使用方法与注意事项

SELECT NULL =0, NULL =12345, NULL <>12345, NULL +12345, NULL || 'abc', NULL = NULL , NULL <> NULL , NULL AND TRUE , NULL AND FALSE , NULL OR FALSE , NULL OR TRUE , NOT (NULL); 如果这是一道面试题,估计不知道有多少程序员甚至是DBA会阵亡-- 正确的答案是什么?(为了加深印象,建议复制SQL到mysql里去执行

php setcookie值为null或空字符串删除cookie解析

官方文档中也是这样写的: #2 setcookie() delete example  代码如下 复制代码 <?php // set the expiration date to one hour ago setcookie ("TestCookie", "", time() - 3600); setcookie ("TestCookie", "", time() - 3600, "/~rasmus/"

mysql中null,not null,default,auto_increment详解

NULL 和 NOT NULL 修饰符: 可以在每个字段后面都加上这NULL 或 NOT NULL 修饰符来指定该字段是否可以为空(NULL),还是说必须填上数据(NOT NULL).MySQL默认情况下指定字段为NULL修饰符,如果一个字段指定为NOT NULL,MySQL则不允许向该字段插入空值(这里面说的空值都为NULL),因为这是"龟定".  代码如下 复制代码 /* 创建好友表,其中id ,name ,pass都不能为空 */ create table friends ( i

Oracle数据库中对null值的排序及mull与空字符串的区别_oracle

order by排序之null值处理方法在对业务数据排序时候,发现有些字段的记录是null值,这时排序便出现了有违我们使用习惯的数据大小顺序问题.在Oracle中规定,在Order by排序时缺省认为null是最大值,所以如果是ASC升序则被排在最后,而DESC降序则排在最前.所以,为何分析数据的直观性方便性,我们需要对null的记录值进行相应处理. 这是四种oracle排序中NULL值处理的方法:1.使用nvl函数语法:Nvl(expr1, expr2)     若EXPR1是NULL,則返回

mysql 中存在null和空时创建唯一索引的方法_Mysql

好多情况下数据库默认值都有null,但是经过程序处理很多时候会出现,数据库值为空而不是null的情况.此时创建唯一索引时要注意了,此时数据库会把空作为多个重复值,而创建索引失败,示例如下: 步骤1: mysql> select phone ,count(1) from User group by phone; +-----------------+----------+ | phone | count(1) | +-----------------+----------+ | NULL | 70