mysql中的NUll是什么 ?

  • 维基百科是这样说的:空值(Null或NULL)是结构化查询语言中使用的特殊标记,是中对数属性未知或缺失的一种标识,用于指示数据库中不具值。由关系数据库模型的创作者 E.F.科德所引入。SQL空值是用来满足真实关系数据库管理系统(RDBMS)中,支持“缺失信息与不适用的信息”的需求。科德还介绍了在数据库理论中使用小写的希腊字母(ω)符号来表示空值。在 SQL中则是以 NULL 用于标识空值的保留关键字。SQL null是一个状态,而不是一个值。这种用法与大多数编程语言完全不同,其中引用的空值意味着不指向任何对象。
  • 这不应与 0 数值混淆。空值表示缺少值-而与零值不同,与缺乏答案的方式不同,作为“否”的答案。例如,考虑“亚当拥有多少本书?”这个问题,答案可能是“零”(我们知道他没有)或“空白”(我们不知道他拥有多少)。在数据库表格中,回报此问题的列结果,将从没有值(标记为Null)开始,并且在我们确定亚当没有书籍之前,并不会更新为值“零”。
  • 数据库表主键的取值不能为空值。另外,数据库中的统计计算,一般将有空值的数据忽略不计。

MYSQL 的null值和’ '值有什么区别呢?

  • 占用空间区别 null值在mysql中的占用空间大小也为null,而’ '值在mysql 中为0。
- mysql>  select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') |
+--------------+------------+-------------+
| NULL         |          0 |           1 |
+--------------+------------+-------------+
1 row in set
  • 查询方式不一样,null值查询必须使用is null/is not null 才能查到为null的record记录但是’ '旧可以使用算数运算符来进行查询 列如 = ,!= ,>,<等。
    需注意的时候当你的数据库字段里面null值的时候,你的a中有为null的值则是查不出来为null的行的。
select * from table where a !=  10
  • COUNT 和 IFNULL函数
  1. 你在查询某一列的的条数的时候如果这一列有null值得时候就不会计算进去,但是你不单独查询某一列,如count(1) 或 count(*)时则是完整的。
  2. IFNULL(filedName,value) 如果你查的filedName 这个列值为null则查出来的这个值就是value。value为默认值
  • 对索引的影响
  1. 首先根据上面我们对null指的理解可以先分析一下,null在数据库中是真是存在且占用空间的,而’ '空白是不占用空间的,那就是说当你用不到这个null的含义的时候,且你的数据库DDL语句并没有使用 not null来定义,那就会浪费很快多的存储空间。那这就是第一点当你的某一列没有定义not NULL的时候且你用这一列去创建索引是会浪费不必要的存储空间 。
  2. 上面也说过了,NULL值在mysql是一种特殊值的存在,
    MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。
    可空列需要更多的储存空间,还需要在MySQL内部进行特殊处理。当可空列被索引的时候,
    每条记录都需要一个额外的字节,还可能导致 MyISAM 中固定大小的索引(例如一个整数列上的索引)变成可变大小的索引。
    即使要在表中储存「没有值」的字段,还是有可能不使用 NULL 的,考虑使用 0、特殊值或空字符串来代替它。
    把 NULL 列改为 NOT NULL 带来的性能提升很小,所以除非确定它引入了问题,否则就不要把它当作优先的优化措施。
    然后,如果计划对列进行索引,就要尽量避免把它设置为可空,虽然在mysql里 Null值的列也是走索引的

    总结:
  3. 在创建MySQL表示尽量要限制not NULL 且给初始值为 ’ ’ 或 0;
  4. NULL值在mysql数据库中是占有存储的, ’ ’ 是不占用的。
  5. 如果某一列有NULL值,且以此列创建索引。这一 列不会出现索引失效,但是会出现索引相对不佳,以及数据库占用存储变大。