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

zhengyingcan 2010-07-27 01:11:04
varchar 类型 当为NULL时,是存储""值好一点,还是NULL值好一点呢,存那种方式有优势点呢,我们现在都是存"",就是担心会不会占多余的空间.
...全文
807 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
bapi 2012-01-01
  • 打赏
  • 举报
回复
使用null的后果就是isnull这个函数将变成你书写频率最高的函数,没有之一。。。
luzhen328 2010-12-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 feilniu 的回复:]
引用楼主 zhengyingcan 的回复:
varchar 类型 当为NULL时,是存储""值好一点,还是NULL值好一点呢,存那种方式有优势点呢,我们现在都是存"",就是担心会不会占多余的空间.



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


从数据库物理引擎角度:
NULL不是一个值,而是一个特殊标记。如果某行记录的某个字段……
[/Quote]

不错
claro 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhengyingcan 的回复:]
现在真的不知道该听谁的啦
[/Quote]你说呢。
licry01 2010-07-30
  • 打赏
  • 举报
回复
NULL是空指针占用零字节, ''占用一个字节.

简单的据个例子, 比如字段A(varchar), 那么每条数据的元都会有下面类似的描述:
{
..............
data_pointer: 实际存储数据的起始地址
data_length: 所指向的数据区的长度
..............
}

NULL的情况如下
{
..............
data_pointer: 0
data_length: 0
..............
}

''的情况如下
{
..............
data_pointer: 0x12345678(瞎写的)
data_length: 1
..............
}


如果对''进行的优化, 事先将其在全局常量数据段内置了:
比如在地址0x00000066这个地方开始, 大小为一个字节, 这样所有数据是''的指向都会指向0x00000066这个地方.
因此在优化的情况下, 用NULL''在存储上可以视为无差别, 在没有优化的情况下, NULL是肯定要比''少的, 具体少多少, 还的看不同厂商数据库引擎的具体实现.



------------------------------
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
feixianxxx 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 feilniu 的回复:]

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



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


从数据库物理引擎角度:
NULL不是一个值,而是一个特殊标记。如果某行记录的某个字……
[/Quote]
...
SQL77 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 feilniu 的回复:]
引用楼主 zhengyingcan 的回复:
varchar 类型 当为NULL时,是存储""值好一点,还是NULL值好一点呢,存那种方式有优势点呢,我们现在都是存"",就是担心会不会占多余的空间.



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


从数据库物理引擎角度:
NULL不是一个值,而是一个特殊标记。如果某行记录的某个字段……
[/Quote]
学习
feixianxxx 2010-07-30
  • 打赏
  • 举报
回复
建表有个原则:尽量在字段定义后面显示声明 Not null。。
NULL带来的逻辑处理很麻烦
zhengyingcan 2010-07-30
  • 打赏
  • 举报
回复
现在真的不知道该听谁的啦
lg314 2010-07-30
  • 打赏
  • 举报
回复
没有特殊需求的话就用'',不然以后以后一大堆isnull,程序访问也不方便
东那个升 2010-07-30
  • 打赏
  • 举报
回复
太多的NULL列就考虑建立稀疏列吧
obuntu 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 feilniu 的回复:]

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



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


从数据库物理引擎角度:
NULL不是一个值,而是一个特殊标记。如果某行记录的某个字……
[/Quote]

拜读。。
feilniu 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhengyingcan 的回复:]
varchar 类型 当为NULL时,是存储""值好一点,还是NULL值好一点呢,存那种方式有优势点呢,我们现在都是存"",就是担心会不会占多余的空间.
[/Quote]


从业务逻辑角度看:
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的存在,你总归难免会遇到它。
feilniu 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 licry01 的回复:]

NULL是空指针占用零字节, ''占用一个字节.

简单的据个例子, 比如字段A(varchar), 那么每条数据的元都会有下面类似的描述:
{
..............
data_pointer: 实际存储数据的起始地址
data_length: 所指向的数据区的长度
..............
}

NULL的情况如下
{
..............
da……
[/Quote]

17楼明显是C语言式的思维。数据库不是这么处理的。
zhengyingcan 2010-07-30
  • 打赏
  • 举报
回复
那17楼吧
cxmcxm 2010-07-28
  • 打赏
  • 举报
回复
用''处理方便些,都是字符串,不用再比较null
--------------------------
另:个人感觉null应该类似空指针,不知1楼的老兄是如何得出null比''占空间的
qingyunzhuimeng 2010-07-27
  • 打赏
  • 举报
回复
进来学习
claro 2010-07-27
  • 打赏
  • 举报
回复
“编译”这词用的不很恰当。
claro 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhengyingcan 的回复:]
原来NULL占用空间更多,谢谢呀,
[/Quote]原因不只这样,数据库引擎在执行脚本的过程中也需要类似编译的过程,对于NULL值更加耗费引擎的处理过程,不建议用NULL。
zhuguson 2010-07-27
  • 打赏
  • 举报
回复
怎么我用LECCO算过,它们所占的空间有时候相等,有时候NULL占的空间大,有时候‘’占的空间大。在不同的数据量下测试的。
加载更多回复(9)

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧