SQL SERVER中Null和空串区别

本文详细阐述了数据库中NULL与空串的区别,包括查询时的不同WHERE条件及coalesce函数使用时的行为差异,并从面向对象的角度解析了两者的本质区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一直以来对NULL和空串的区别搞不清楚。

 

空串的直观感受如下图:(通俗的讲,就是不显示NULL且是一片空白的东东)

 


而NULL的直观感受如下图:



 --------------------------------------------------------

 

区别一:

当你用SQL语句以上面这三个字段查询时,用的WHRE条件不一样。

1、查询空串

SQL语句:select * from talbe where BPAgent=''

 

而查询NULL

SQL语句:select * from talbe where ClCmtAccSbjtName is NULL.

 

下成从面向对象的角度来解释这一现象:

空串:其实是字符串的一种,你可以把它当成普通的字符串。我记得在.net中有这样一个常量,叫做String.Empty()。

这也可以从侧面证明空串只是一个普通的字符串,不过他是一个已经被实例化过的OBJECT。

 

NULL:它是一个OBJECT,不过还未被实例化。

 

好了,从上面来看,它们的本质区别就是一个已经被实例化,一个还未被实例化。

 

 

区别二:

从coalesce的用法也可以看得出来。

数据库的数据如下图:


 

1、比如想看BPAgent和CustomerId中第一个不为NULL的。

 

某人这样写:

select coalesce(BPAgent,CustomerId) from table。

它认为出来的应该是CustomerId.

然而出来的结果却是如下图:



 这是为什么呢?

从上面的分析就可以看出,SQL SERVER并不把空串当成NULL,它认为BPAgent就是一个不为NULL的字段。

 

正解:

select coalesce(ClCmtAccSbjtName ,CustomerId) from table。

此时出来的结果如下图:


 

--------------------------------------------------------------

好了,解释完毕。

<think>嗯,用户问的是数据库表中null空串区别。这个问题看起来基础,但实际应用中确实容易混淆。我得先理清楚两者的定义区别。 首先,null字符串在数据库里都是表示“没有数据”的情况,但它们的含义不同。我记得null代表的是未知或缺失的数据,也就是说这个字段还没有被赋值,或者不适用。而字符串是一个具体的值,只不过长度为零。比如,用户填表单时,如果没填某个字段,数据库里可能存null,但如果填了一个,可能就是字符串了。 接下来要比较它们在数据库中的处理方式。比如,在SQL查询中,判断null需要用IS NULL或IS NOT NULL,而字符串可以直接用= ''或者<> ''。举个例子,SELECT * FROM table WHERE column IS NULL; SELECT * FROM table WHERE column = ''; 会得到不同的结果。 存储方式也可能不同。null通常不占用物理存储间,而字符串可能需要存储一个长度为零的字符串,不过这可能因数据库系统而异。比如MySQL中,字符串确实会占用一点间,而null则不会。 还有索引的影响。如果字段允许null,索引可能会包含null值,但有些数据库在创建唯一索引时,可能会有不同的处理方式。比如,某些数据库允许唯一索引字段有多个null,但字符串只能出现一次,因为它们是实际的值。 默认值也是一个区别。创建表的时候,如果字段设置为NOT NULL,默认值可能需要指定,而允许null的话,默认可能就是null字符串的话,可能需要显式设置默认值为''。 应用场景方面,比如用户的中间名可能允许null,表示不适用,而如果用户明确不提供,可能用字符串。不过这里可能要看具体业务需求。 可能还要注意不同数据库系统的差异,比如Oracle会把字符串视为null,但其他数据库如MySQL、PostgreSQL则区分两者。这点需要特别提醒用户,避免跨数据库迁移时出现问题。 用户可能的疑问还包括性能上的考虑,null字符串哪个更好。一般来说,null可能在某些情况下更高效,但具体还要看使用场景数据库的实现。 最后要总结两者的关键区别,帮助用户明确何时使用null,何时使用字符串。可能还要提醒在设计查询时注意正确的语法,避免因为混淆导致查询结果错误。</think>### 逐步解析:数据库表中 `NULL` 空串(`''`)的区别 --- #### **1. 本质区别** - **`NULL`** - 表示 **未知、缺失或不适用的值**。 - 属于数据库的 **特殊标记**,代表“无数据”。 - 示例:用户未填写年龄字段时,存储为 `NULL`。 - **空串(`''`)** - 表示 **已知且明确存在的值**。 - 属于 **字符串类型** 的合法值,长度为0。 - 示例:用户明确填写了姓名字段但留,存储为 `''`。 --- #### **2. 查询语法差异** - **判断 `NULL`** 需使用 `IS NULL` 或 `IS NOT NULL`: ```sql SELECT * FROM users WHERE age IS NULL; ``` - **判断空串** 直接使用等号(`=`)或不等号(`!=`): ```sql SELECT * FROM users WHERE name = ''; ``` ⚠️ 错误示例: ```sql SELECT * FROM users WHERE name IS NULL; -- 无法匹配空串 SELECT * FROM users WHERE age = ''; -- 类型不匹配(若 age 是数值型) ``` --- #### **3. 存储与索引行为** | 特性 | `NULL` | 空串(`''`) | |---------------------|-------------------------------|---------------------------| | 存储间占用 | 通常不占用间(标记位存储) | 占用间(存储长度为0的字符串) | | 唯一索引约束 | 可能允许多个`NULL`(取决于数据库) | 仅允许一个空串(视为具体值) | | 聚合函数处理 | `COUNT(column)` 会忽略`NULL` | 空串会被统计 | --- #### **4. 默认值与约束** - **默认值设置** ```sql CREATE TABLE users ( -- 允许 NULL,默认未赋值时为 NULL notes VARCHAR(100), -- 禁止 NULL,默认未赋值时为空串 address VARCHAR(100) NOT NULL DEFAULT '' ); ``` - **非约束** - 若字段定义为 `NOT NULL`,则不能插入 `NULL`,但可以插入空串(需字段为字符串类型)。 --- #### **5. 应用场景建议** - 使用 `NULL` 的场景: - 数据缺失或未知(如未填写的可选字段)。 - 区分“未设置”“明确留”。 - 使用空串的场景: - 明确表示“无内容”(如用户填写了白的备注)。 - 需要参与字符串操作(如拼接 `CONCAT('Hello', name)`)。 --- #### **6. 常见数据库差异** - **Oracle** 将空串自动转换为 `NULL`,两者无区别。 - **MySQL/PostgreSQL/SQL Server** 严格区分 `NULL` 空串。 --- ### 总结表格 | 维度 | `NULL` | 空串(`''`) | |-----------|-----------------------------|---------------------------| | **语义** | 未知或缺失 | 已知且明确为 | | **查询语法**| `IS NULL`/`IS NOT NULL` | `= ''`/`!= ''` | | **存储** | 通常不占间 | 占间(字符串类型) | | **索引** | 可能允许多个`NULL` | 视为唯一值 | | **适用性** | 区分“未设置”“无内容” | 明确表示“无内容” | 通过合理选择 `NULL` 或空串,可以更精确地描述数据状态,避免逻辑错误!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值