如何在SQL Server中存储NULL和Empty Varchar值.如果我的UI上的某个字段没有用户条目,我应该存储一个还是一个?stringNULL''
ope*_*hac 57
有一个很好的文章在这里,其中讨论了这一点.需要注意的关键是表大小没有区别,但有些用户更喜欢使用空字符串,因为它可以使查询更容易,因为没有NULL检查.您只需检查字符串是否为空.需要注意的另一件事是NULL在关系数据库的上下文中意味着什么.这意味着指向字符字段的指针在行的标头中设置为0x00,因此无法访问数据.
更新 有一个详细的文章在这里它谈论什么是真正发生连续的基础上
对于允许空值的列,每行都有一个空位图.如果该列中的行为null,则位图中的位为1,否则为0.
对于可变大小的数据类型,实际大小为0字节.
对于固定大小的数据类型,acctual大小是默认数据类型大小(以字节为单位)设置为默认值(0表示数字,''表示字符).
DBCC PAGE的结果显示NULL和空字符串都占用零字节.
Vag*_*rdi 35
注意空值并检查sql server中的不等式.
例如
select * from foo where bla <> 'something'
Run Code Online (Sandbox Code Playgroud)
不会返回bla为null的记录.尽管逻辑上它应该.
所以检查的正确方法是
select * from foo where isnull(bla,'') <> 'something'
Run Code Online (Sandbox Code Playgroud)
当然人们经常忘记然后会发现奇怪的错误.
Ken*_*ent 13
空字符串是长度为零或没有字符的字符串.
Null没有数据.
NULL和“空字符串”之间的概念差异在数据库设计中是真实且非常重要的,但是经常会被误解和应用不正确-这是对两者的简短描述:
NULL-表示我们不知道该值是什么,它可能存在,但可能不存在,我们只是不知道。
空字符串 -表示我们知道值是什么,什么也不是。
这是一个简单的示例:假设您有一个包含人名的表,其中包括first_name,middle_name和last_name的单独列。在first_name ='John',last_name ='Doe'和middle_name为 NULL的情况下,这意味着我们不知道中间名是什么,甚至不存在。更改该方案,使middle_name =''(即空字符串),现在意味着我们知道没有中间名。
我曾经听过一位SQL Server讲师提倡将数据库中的每个字符类型列都设置为必需,然后为每个''(空字符串)或“未知”分配一个默认值。在说明这一点时,讲师证明他对NULL和空字符串之间的区别没有清楚的了解。诚然,这些差异似乎令人困惑,但是对我而言,上面的示例有助于阐明差异。同样,重要的是要了解编写SQL代码时的区别,并正确处理NULL和空字符串。
| 归档时间: |
|
| 查看次数: |
148689 次 |
| 最近记录: |