MySQL 中NULL和空值的区别 (转载 http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html)
平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解。注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效率的事情的发生。
eg:
ERROR 1048
(23000): Column 'c' cannot be null
select *
from testaa;
| b
| c |
| aa
| |
|
|
|
| NULL
|
|
| NULL
|
|
| aafa
| fa |
select *
from testaa
where c
is not
null;
| b
| c |
| aa
| |
|
|
|
| NULL
|
|
| NULL
|
|
| aafa
| fa |
in set
(0.00
sec)
select *
from testaa
where c
<> '';
| b
| c |
| aafa
| fa |
in set
(0.00
sec)
select *
from testaa
where
c = '';
| b
| c |
| aa
| |
|
|
|
| NULL
| |
| NULL
| |
in set
(0.00
sec)
is null;
set (0.00 sec)
select *
from testaa
where b
is not
null;
| b
| c |
| aa
| |
|
|
|
| aafa
| fa |
in set
(0.00
sec)
select *
from testaa
where b
<> '';
| b
| c |
| aa
| |
| aafa
| fa |
in set
(0.00
sec)
select *
from testaa
where b
='';
| b
| c |
|
|
|
in set
(0.00
sec)
is null;
| b
| c |
| NULL
| |
| NULL
| |
select length(b),length(c) from testaa;
+-----------+-----------+
| length(b) |
length(c)
|
+-----------+-----------+
| 2 | 0 |
| 0 | 0 |
| NULL
| 0 |
| NULL
| 0 |
| 4 | 2 |
+-----------+-----------+
5 rows
in set
(0.00
sec)
select count(b),count(c) from testaa;
+----------+----------+
| count(b) |
count(c)
|
+----------+----------+
| 3 | 5 |
+----------+----------+
1 row
in set
(0.00
sec)
create table testbb ( a int primary key , b timestamp);
Query OK, 0 rows affected (0.07 sec)
show create table testbb;
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table
| Create
Table |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| testbb
| CREATE TABLE
`testbb` (
`a` int(11) NOT
NULL,
`b` timestamp NOT NULL
DEFAULT CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP,
PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT
CHARSET=utf8 |
+--------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
insert into
testbb vales (1,null) ;
insert into
testbb values (2,'');
Query OK, 1 row affected, 1 warning (0.00 sec)
show warnings;
+---------+------+----------------------------------------+
| Level
| Code
| Message
|
+---------+------+----------------------------------------+
| Warning
| 1265
| Data
truncated for
column 'b'
at row 1
|
+---------+------+----------------------------------------+
select *
from testbb;
+---+---------------------+
| a | b |
+---+---------------------+
| 1 | 2014-08-15 14:32:10 |
| 2 | 0000-00-00 00:00:00 |
+---+---------------------+
2 rows
in set
(0.00
sec)
判断NULL
用IS NULL
或者 is
not null,SQL 语句函数中可以使用ifnull()函数来进行处理,判断空字符用
=''或者 <>''来进行处理
对于MySQL特殊的注意事项,对于timestamp数据类型,如果往这个数据类型插入的列插入NULL值,则出现的值是当前系统时间。插入空值,则会出现
'0000-00-00
00:00:00'
除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议,请往下看。
首先,我们要搞清楚“空值” 和 “NULL” 的概念:
1、空值是不占用空间的
2、MySQL中的NULL其实是占用空间的
所谓的NULL就是什么都没有,连\0都没有,\0在字符串中是结束符,但是在物理内存是占空间的,等于一个字节,而NULL就是连这一个字节都没
有。在数据库里是严格区分的,任何数跟NULL进行运算都是NULL, 判断值是否等于NULL,不能简单用=,而要用IS NULL关键字。
数据库的字段ID设为NOT NULL, 仅仅说明该字段不能为NULL, 也就是说只有在
INSERT INTO table(ID) VALUES(NULL);
这种情况下数据库会报错,而
INSERT INTO table(ID) VALUES( ‘ ‘);
这不能说明是NULL, 数据库系统会根据ID设的缺省值填充,或者如果是自增字段就自动加一等缺省操作。
尽量避免NULL:应该指定列为NOT
NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,而且对表索引时不会存储NULL值的,所以如果索引的字段可以为
NULL,索引的效率会下降很多。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
MySQL 中NULL和空值的区别 (转载 http://blog.sina.com.cn/s/blog_3f2a82610102v4dn.html)的更多相关文章
- MySQL 中NULL和空值的区别,索引列可以有空值或者null吗?
空值跟null的区别.mysql官方: “NULL columns require additional space in the row to record whether their values ...
- 【面试】MySQL 中NULL和空值的区别?
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 01 小木的故事 作为后台开发,在日常工作中如果要接触Mysql数据库,那么不可避免会遇到Mysql中的NULL和空值.那 ...
- MySQL 中NULL和空值的区别
平时我们在使用MySQL的时候,对于MySQL中的NULL值和空值区别不能很好的理解.注意到NULL值是未知的,且占用空间,不走索引,DBA建议建表的时候最好设置字段是NOT NULL 来避免这种低效 ...
- quartus ii13.0~16.0 调用uedit (转载http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html)
转自 http://blog.sina.com.cn/s/blog_6d5560f00102vax6.html Quartus II 中的文本编辑软件不好用,比较习惯与UE(Uedit32/ultra ...
- mysql中null与“空值”的坑
https://blog.csdn.net/u014743697/article/details/54136092
- GnuDIP制作动态域名服务器(DDNS Server)_转载http://blog.sina.com.cn/s/blog_4d4c23530100rlfj.html
这个阶段在做DDNS,虽然有dyndns和tzo两个免费的国外的DDNS服务器(支持免费用户注册使用),但是公司需求中要有GnuDIP这种服务.于是只能自己制作DDNS服务器,颇费功夫,于是想把这段记 ...
- nginx、fastCGI、php-fpm关系梳理(转载 http://blog.sina.com.cn/s/blog_6df9fbe30102v57y.html)
前言: Linux下搭建nginx+php+memached(LPMN)的时候,nginx.conf中配需要配置fastCGI,php需要安装 php-fpm扩展并启动php-fpm守护进程, ...
- 基本滤波算法比较 (转载http://blog.sina.com.cn/s/blog_69f2aa5a01014du5.html)
最近在做关于数据采集方面的东西,这就不免涉及到了滤波的算法,在网上找到了关于几种算法的比较. 数字滤波方法有很多种,每种方法有其不同的特点和使用范围.从大的范围可分为3类. 1.克服大脉冲干扰的数字滤 ...
- EFDC主控文件efdc.inp文件的xml格式化处理——转载http://blog.sina.com.cn/s/articlelist_1584892573_0_1.html
在对EFDC模型进行系统集成时,虽然可以通过一行一行读来进行解析处理,但那将是一个繁琐的工作.我们经过xml格式化处理后,再经xsd转成Dataset类对象,那么整个主控文件就是一个数据库表集合,对其 ...
随机推荐
- jquery mobile 方法收集.
1.在列表项和按钮上禁用文本截断 如果你的列表项或者按钮上是一个很长的文本,它将会被jQuery Mobile自动截断,要禁用这个截断设置,需要在CSS选择器上添加属性"white- ...
- rpc rmi http
1.RPC与RMI (1)RPC 跨语言,而 RMI只支持Java. (2)RMI 调用远程对象方法,允许方法返回 Java 对象以及基本数据类型,而RPC 不支持对象的概念,传送到 RPC 服务的消 ...
- 转:Windows Socket五种I/O模型
原文转自: Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...
- [LeetCode]题解(python):037-Sudoku Solver
题目来源 https://leetcode.com/problems/sudoku-solver/ Write a program to solve a Sudoku puzzle by fillin ...
- Upgrade Image&ntext to varbinarymax&nvarchar(max)
CREATE PROCEDURE SP_EXEC_WITH_LOG(@I_TICKETNO VARCHAR(10),@I_SQLSTR nvarchar(max))ASBEGIN DECLARE ...
- RedHat6.6安装Oracle11gR2
RedHat6.6安装Oracle11gR2 一.Centos6.6的安装配置 1- 选择安装模式 2- 选择“skip”,跳过检查. 3- 选择“下一步” 4- ...
- 我就是认真:Linux SWAP 深度解读(必须收藏)
我就是认真:Linux SWAP 深度解读(必须收藏) http://mp.weixin.qq.com/s?__biz=MzA4Nzg5Nzc5OA==&mid=2651660097& ...
- js转换 /Date(1464671903000)/ 格式的日期的方法
转换成:2016-07-11 function getFDate(date) { var d = eval('new ' + date.substr(1, date.length - 2)); var ...
- 解决git clone时报错:The requested URL returned error: 401 Unauthorized while accessing
版本问题,最直接的解决办法就是重新编辑安装git吧: 1. 下载:# wget -O git.zip https://github.com/git/git/archive/master.zip 2. ...
- MongoDB概念解析
数据库 MongoDB默认把_id设置为主键(_开头的键是保留的) 数据库名必须为小写 RDBMS与MongoDB对应的术语比较 需注意 文档中的键/值对是有序的. 文档中的值不仅可以是在双引号里面的 ...