varchar 类型 当为NULL时,是存储值好,还是NULL值好

来源:互联网 发布:软件开发后期维护 编辑:程序博客网 时间:2024/04/30 22:17

varchar 类型 当为NULL时,是存储""值好一点,还是NULL值好一点呢,存那种方式有优势点呢,我们现在都是存"",就是担心会不会占多余的空间.

如果在你的数据库设计中,NULL没有明确的含义,建议你把所有字段都加上默认值,不要使用NULL。另外NULL占的空间比空字符串要多。

看你的需要吧,我自己感觉一般情况下还是null吧,null是未输入任何值,‘’是空,概念也不一样,要是从数据库中提取并处理值的话,‘’是可以被处理的,但是null处理会出错。

建议用'',NULL是不存在的值,针对字串和NULL的任何操作都是NULL,可能会对系统的逻辑处理带来麻烦.

根据需求设置,
如果没有设置默认值或者没有输入值,sql server 将默认为null.
null是未输入任何值,''是空,概念也不一样,要是从数据库中提取并处理值的话,''是可以被处理的,null处理会出错.

怎么我用LECCO算过,它们所占的空间有时候相等,有时候NULL占的空间大,有时候‘’占的空间大。在不同的数据量下测试的。

原因不只这样,数据库引擎在执行脚本的过程中也需要类似编译的过程,对于NULL值更加耗费引擎的处理过程,不建议用NULL。

从业务逻辑角度看:
NULL用来表示一个未知的、不确定的值。跟''空字符串是两回事。


从数据库物理引擎角度:
NULL不是一个值,而是一个特殊标记。如果某行记录的某个字段为NULL,则需要一个额外的标记来注明这个值为NULL。因此,一个NULL的字段所占用的空间大于等于一个NOT NULL的字段。
具体空间使用情况要看不同厂商数据库引擎的具体实现。

对SQLServer 2005来说:
数据行:一个表的字段,不管是声明为NOT NULL还是NULL,每行记录总是需要CEILING(1.0 * 字段个数 / 8)个字节(即每个字段1bit)来表示NULL标记(称为空值位图)。
索引行:当索引键中包含可空字段时,每个索引行需要2个字节存储索引行字段个数和CEILING(1.0 * 索引行字段个数 / 8)个字节来表示空值位图。当索引键所有字段都为NOT NULL时,这些空间可以省下来。
而且,以后的版本中,SQLServer可能会把NOT NULL的字段浪费的空位图节省出来。

总的来说就是:字段允许NULL,可能会占用更多空间。而且判断字段是否为NULL需要计算空值位图,比直接查值要多一些运算。


从数据库设计角度:
从设计上来看,允许为NULL带来的那点空间和时间开销基本可以忽略(远没有合理设计字段大小更省空间,远没有合理设计索引更省时间),这不是拒绝NULL的关键理由。

不使用NULL的理由:
1. NULL会引入复杂的三值逻辑。
2. NULL在查询条件、外键和CHECK约束、唯一约束、GROUP BY、ORDER BY中的行为都是不一致的。

使用NULL的理由:
1. 当需要表示一个未知的、不确定的值时,用NULL更自然。比如一个现在职员工的离职时间、顶级员工(BOSS)的上级员工,等等。
2. 外联接通常会引入NULL,即使所有表的字段都定义为NOT NULL。


结论:
1. 如果可能,尽量让所有字段都声明为NOT NULL。除非是更适合使用NULL的场合(从业务出发)。
2. 深入理解三值逻辑和NULL在不同情况下的行为。只要SQL允许NULL的存在,你总归难免会遇到它。
没有特殊需求的话就用'',不然以后以后一大堆isnull,程序访问也不方便太多的NULL列就考虑建立稀疏列吧

来源:英超直播