当前位置: 首页 > article >正文

NULL与空字符串的区别:数据库专家详解

NULL与空字符串的区别:数据库专家详解

1. NULL的概念解析

1.1 NULL的定义

在数据库系统中,NULL是一个特殊标记,表示"未知"或"不存在"的值。它不是任何数据类型的实例,而是表示缺失值的标记。
go专栏:https://duoke360.com/tutorial/path/golang

关键结论:NULL不是空值、不是零、不是空字符串,而是表示"值未知"或"无值"的状态标记。

1.2 NULL的三值逻辑

与常规的二值逻辑(真/假)不同,引入NULL后数据库使用三值逻辑:

  • TRUE
  • FALSE
  • UNKNOWN (由NULL引起)
SELECT 1 = NULL;  -- 结果不是TRUE或FALSE,而是NULL(UNKNOWN)
SELECT NULL IS NULL;  -- 这才是TRUE

2. 空字符串的概念

2.1 空字符串定义

空字符串(‘’)是一个确定的值,它是长度为0的字符串。在内存中会分配存储空间,只是内容为空。

关键区别:空字符串是字符串类型的有效值,而NULL表示该字段没有值。

2.2 空字符串的存储

不同数据库对空字符串的处理:

  • MySQL:区分NULL和’'(空字符串)
  • Oracle:将空字符串视为NULL
  • SQL Server:区分NULL和’’

3. NULL与空字符串的核心区别

3.1 语义差异

特性NULL空字符串(‘’)
语义未知/不存在已知的空值
数据类型无类型字符串类型
存储表示无存储有存储
比较操作需用IS NULL用= ‘’

3.2 存储与索引差异

  • NULL通常不占用存储空间(除标记位外)
  • 空字符串会占用存储空间(至少是长度标识)
  • B树索引中,NULL值通常不被索引(除非创建过滤索引)
-- 创建测试表
CREATE TABLE test_values (id INT PRIMARY KEY,null_col VARCHAR(100) NULL,empty_col VARCHAR(100) NOT NULL DEFAULT ''
);-- NULL不占用空间(除NULL标记位)
INSERT INTO test_values(id, null_col) VALUES(1, NULL); -- 空字符串占用空间
INSERT INTO test_values(id, empty_col) VALUES(2, '');

4. 实际应用场景

4.1 何时使用NULL

  1. 表示信息缺失(如未知的手机号)
  2. 表示不适用(如未婚人士的配偶姓名)
  3. 作为外键表示无关联记录

4.2 何时使用空字符串

  1. 表示明确无内容(如中间名可为空的姓名)
  2. 需要字符串操作的字段(如CONCAT处理)
  3. 需要默认值但内容为空的情况

5. 面试常见问题解析

5.1 经典面试题示例

问题:以下SQL查询结果有何不同?

SELECT * FROM users WHERE phone = '';
SELECT * FROM users WHERE phone IS NULL;
SELECT * FROM users WHERE phone IS NULL OR phone = '';

专家解答

  1. 第一个查询找出phone为空字符串的记录
  2. 第二个查询找出phone为NULL的记录
  3. 第三个查询找出phone为NULL或空字符串的所有记录

5.2 聚合函数处理差异

SELECT COUNT(*),          -- 统计所有行COUNT(column),     -- 统计非NULL行SUM(column),       -- NULL视为0AVG(column)        -- 忽略NULL值
FROM table;

重要提示:COUNT(*)计算所有行数,COUNT(column)只计算非NULL值

6. 最佳实践建议

  1. 一致性原则:在整个数据库中统一NULL的使用规范
  2. NOT NULL约束:对于必须有值的列显式声明NOT NULL
  3. COALESCE函数:处理NULL值转为默认值 COALESCE(col, 'N/A')
  4. NULLIF函数:将特定值转为NULL NULLIF(col, '')
  5. 索引考虑:注意NULL值在索引中的特殊行为

7. 高级话题延伸

7.1 NULL与性能

  • 空间:NULL通常比空字符串占用更少空间
  • 索引:NULL值可能不被B树索引包含(取决于DBMS)
  • 查询优化IS NULL条件可能导致全表扫描

7.2 各数据库实现差异

数据库NULL排序位置空字符串处理
MySQL最小值区分NULL和’’
Oracle最大值''视为NULL
SQL Server最小值区分NULL和’’
PostgreSQL最大值区分NULL和’’

掌握这些区别对于跨数据库应用开发至关重要。

相关文章:

NULL与空字符串的区别:数据库专家详解

NULL与空字符串的区别:数据库专家详解 1. NULL的概念解析 1.1 NULL的定义 在数据库系统中,NULL是一个特殊标记,表示"未知"或"不存在"的值。它不是任何数据类型的实例,而是表示缺失值的标记。 go专栏&#…...

github 2FA双重认证丢失解决

文章目录 前言一. 凭借ssh 解锁步骤1.1 要求输入设备码1.2.进入二重验证界面1.3.开始2FA恢复1.4.选择使用ssh验证 二.预防措施2.1 云盘上传git_recover_codes.txt2.2 开启多源FA认证2.2.1 大陆无法使用手机验证码 三.参考资料 前言 场景:没有意识到github recovery …...

linux驱动 - 5: simple usb device驱动

参考第2节, 准备好编译环境并实现hello.ko: linux驱动 - 2: helloworld.ko_linux 驱动开发 hello world ko-CSDN博客 下面在hello模块的基础上, 添加代码, 实现一个usb设备驱动的最小骨架. #include <linux/init.h> #include <linux/module.h> #include <lin…...

OpenCV CUDA模块直方图计算------在 GPU 上计算输入图像的直方图(histogram)函数histEven()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于在 GPU 上计算输入图像的直方图&#xff08;histogram&#xff09;。它将像素值区间均匀划分为若干个 bin&#xff08;桶&#xff09;…...

QT/c++航空返修数据智能分析系统

简介 1、区分普通用户和管理员 2、界面精美 3、功能丰富 4、使用cppjieba分词分析数据 5、支持数据导入导出 6、echarts展示图表 效果展示 演示链接 源码获取 int main(){ //非白嫖 printf("&#x1f4e1;:%S","joyfelic"); return 0; }...

Spring Security架构中过滤器的实现

Spring Security过滤器基础 过滤器链工作原理 在Spring Security架构中,过滤器链(Filter Chain)是安全机制的核心实现方式。当HTTP请求到达时,会依次通过一系列具有明确顺序的过滤器。例如认证过滤器会拦截请求并将认证职责委托给授权管理器。若需要在认证前执行特定逻辑…...

Playwright Python API 测试:从入门到实践

Playwright Python API 测试&#xff1a;从入门到实践 在现代软件开发中&#xff0c;API 测试是确保应用程序后端功能正常运行的关键环节。Playwright 是一个强大的自动化测试工具&#xff0c;支持多种编程语言&#xff0c;其中包括 Python。通过 Playwright&#xff0c;我们可…...

ETL脚本节点使用的方式

随着大数据时代的到来&#xff0c;企业对数据处理的需求日益增长&#xff0c;ETL 作为数据整合的关键技术&#xff0c;逐渐走进我们的视野。本文将为您揭秘 ETL 脚本节点的使用方式&#xff0c;助您轻松驾驭数据处理新境界。 一、ETL脚本的优势 1.提高效率&#xff1a;ETL 脚…...

PH热榜 | 2025-06-02

1. Circuit Tracer 标语&#xff1a;Anthropic的开放工具&#xff1a;让我们了解AI是如何思考的 介绍&#xff1a;Anthropic的开源工具Circuit Tracer可以帮助研究人员理解大型语言模型&#xff08;LLMs&#xff09;&#xff0c;它通过将内部计算可视化为归因图的方式展现相关…...

Domain Adaptation in Vision-Language Models (2023–2025): A Comprehensive Review

Domain Adaptation in Vision-Language Models (2023–2025): A Comprehensive Review Overview Recent research (2023–2025) has increasingly focused on adapting large Vision-Language Models (VLMs) to new domains and tasks with minimal supervision. A core tren…...

容器化革命:告别传统Dockerfile,拥抱现代构建最佳实践

前言 还记得我第一次自信满满地写Dockerfile时,感觉自己像个DevOps天才👑。但很快我就发现,管理这些文件变成了噩梦——安全问题、意外的构建问题、臃肿的镜像层出不穷。如果你一直在手动编写Dockerfile,让我告诉你:有更好的方法! 本文将揭示传统Dockerfile编写方式的…...

: influxdb + grafana+JMeter

influxdb和Grafana 不安装在被测机器上&#xff0c;可以统一放到一台机器上面 1、influxdb&#xff1a;一种时序数据库&#xff0c; 可以永久性保存数据【除非手动清除和数据库坏了】 2、Grafana&#xff1a;grafana是一款用go编写的开源应用&#xff0c;用于大规模指标数据的可…...

Vue拖拽组件:vue-draggable-plus

vue-draggable-plus 学习文档 简介 vue-draggable-plus 是一个基于 Sortablejs 的 Vue 拖拽排序组件&#xff0c;专为 Vue 3 (>v3) 或 Vue >2.7 设计。该组件解决了官方 Sortablejs Vue 组件与 Vue 3 严重脱节的问题。 核心特性 &#x1f3af; 多种使用方式&#xff…...

TDengine 基于 TDgpt 的 AI 应用实战

基于 TDgpt 时序数据智能体的风力发电预测 作者&#xff1a; derekchen Demo 数据集准备 我们使用公开的UTSD数据集里面的某风场发电数据&#xff0c;作为预测算法的数据来源&#xff0c;基于历史数据预测未来一天内的每15分钟的发电量。原始数据集的采集频次为4秒&#xff…...

RocketMQ 消息发送核心源码解析:DefaultMQProducerImpl.send () 方法深度剖析

引言 在分布式系统中&#xff0c;消息队列是实现异步通信、服务解耦和流量削峰的关键组件。Apache RocketMQ 作为一款高性能、高可靠的消息中间件&#xff0c;被广泛应用于各类互联网场景。其中&#xff0c;消息发送是最基础也是最重要的功能之一。本文将深入剖析 RocketMQ 中…...

BiliNote部署实践

​ 开源地址&#xff1a; https://github.com/JefferyHcool/BiliNote &#x1f680; 快速开始 1. 克隆仓库 git clone https://github.com/JefferyHcool/BiliNote.git cd BiliNote mv .env.example .env2. 启动后端&#xff08;FastAPI&#xff09; cd backend pip insta…...

deepseek问答记录:请讲解一下transformers.HfArgumentParser()

1. 核心概念&#xff1a; transformers.HfArgumentParser 是 Hugging Face Transformers 库提供的一个命令行参数解析器。它基于 Python 内置的 argparse 模块&#xff0c;但进行了专门增强&#xff0c;目的是为了更简单、更优雅地管理机器学习&#xff08;尤其是 NLP 任务&am…...

bismark OT CTOT OB CTOB 以及mapping后的bam文件中的XG,XR列的含义

首先&#xff0c;OT&#xff0c;OB&#xff0c;CTOT&#xff0c;CTOB都是描述测序reads的&#xff0c;而不是描述参考基因组的。 bisul-fate建库会将DNA双链文库中非甲基化的C转化成U。转化结束后&#xff0c;被转化的U和互补链的G并不配对。此时正链&#xff08;&#xff0c;…...

new语法

在C中&#xff0c;new 是用于动态内存分配的操作符&#xff0c;允许在运行时请求内存空间。以下是 new 的完整语法和用法说明&#xff1a; 1. 基本语法 1.1 单一对象分配 type* pointer new type(initializer);作用&#xff1a;分配一个 type 类型的对象&#xff0c;并返回…...

npm、yarn幽灵依赖问题

很好&#xff01;我们来专门讲讲**幽灵依赖&#xff08;Phantom Dependency&#xff09;**是什么&#xff0c;以及为什么 pnpm 对这个问题非常严格。 &#x1f47b; 什么是幽灵依赖&#xff1f; 幽灵依赖&#xff08;Phantom Dependency&#xff09;&#xff0c;指的是&#x…...

Android Native 之 adbd进程分析

目录 1、adbd守护进程 2、adbd权限降级 3、adbd命令解析 1&#xff09;adb shell 2&#xff09;adb root 3&#xff09;adb reboot 4、案例 1&#xff09;案例之实现不需要执行adb root命令自动具有root权限 2&#xff09;案例之实现不需要RSA认证直接能够使用adb she…...

CAN通讯协议中各种参数解析

1.各种参数缩写 2.多帧传输时间参数解析 - Sender&#xff08;左侧&#xff09; 指的是 多帧数据的发送者&#xff0c;也就是&#xff1a; ECU&#xff08;被测系统 / 响应方&#xff09; - Receiver&#xff08;右侧&#xff09; 指的是 多帧数据的接收者&#xff0c;也就是…...

网络攻防技术三:网络脆弱性分析

文章目录 一、影响安全的因素二、计算机网络三、网络体系结构脆弱性1、因特网容易被攻击的特性 四、典型网络协议安全性分析&#xff08;重要&#xff09;1、IPv42、RIP&#xff08;UDP)3、ICMP(UDP)4、ARP5、OSPF(IP数据报&#xff09;6、BGP(TCP)7、UDP8、TCP9、DNS(UDP)10、…...

(八)登录认证与学生写作画像

本次将赵昱琨同学之前完成的学生写作画像与智能学习路径规划的后端与目前已有的后端框架进行整合。同时为了实现学生写作画像与智能学习路径规划&#xff0c;需要在之前简易的登录系统上进行重构&#xff0c;所以本次大规模重写了登录模块&#xff0c;同时发现很多过去冗余的代…...

Netty学习example示例

文章目录 simpleServer端NettyServerNettyServerHandler Client端NettyClientNettyClientHandler tcp&#xff08;粘包和拆包&#xff09;Server端NettyTcpServerNettyTcpServerHandler Client端NettyTcpClientNettyTcpClientHandler protocolcodecCustomMessageDecoderCustomM…...

几种常用的Agent的Prompt格式

一、基础框架范式&#xff08;Google推荐标准&#xff09; 1. 角色与职能定义 <Role_Definition> 你是“项目专家”&#xff08;Project Pro&#xff09;&#xff0c;作为家居园艺零售商的首席AI助手&#xff0c;专注于家装改造领域。你的核心使命&#xff1a; 1. 协助…...

数据库运维管理系统在AI方向的实践

引言 关系型数据库(如MySQL、PostgreSQL、SQL Server、Oracle等)作为核心数据存储平台,承载着关键业务系统的运行。数据库的运维管理(DBA)工作变得愈发复杂和重要,涉及性能监控、故障诊断、容量规划、安全审计、自动化运维等多个方面。传统的数据库运维依赖人工经验,效…...

[RoarCTF 2019]Easy Calc

查看源代码 <!--Ive set up WAF to ensure security.--> <script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div …...

[Windows]在Win上安装bash和zsh - 一个脚本搞定

目录 前言安装步骤配置要求下载安装脚本启动程序 前言 Windows是一个很流行的系统, 但是在Windows上安装bash和zsh一直是一个让人头疼的问题. 本蛙特意打包了一个程序, 用于一站式解决这一类的问题. 安装步骤 配置要求 系统: Windows软件: Powershell 5.1或以上 下载安装…...

ubuntu系统上运行jar程序输出时间时区不对

springboot项目打包jar文件在ubuntu系统上运行&#xff0c;发现在系统和日志里面&#xff0c;显示和打印的当前时间时区都是UTC0&#xff0c;通过timedatectl命令设置系统时区为Asia/Shanghai&#xff0c;命令date -R发现系统已经修改成功&#xff0c;但是发现springboot仍然输…...