博客
关于我
postgre数据库下的 NOT NULL 和 空串(虽然有NOT NULL设定,但是可以插入空串'')
阅读量:754 次
发布时间:2019-03-23

本文共 1090 字,大约阅读时间需要 3 分钟。

数据库空值与空字符串问题

最近,我们遇到了一个有趣的技术问题。在项目中,我们的数据库表的一列新增了一个item_name字段,并且设定了NOT NULL约束。然而,在测试过程中,遇到了一种情况:当尝试将该字段设为空值时,发现根本无法实现。这引发了我们对数据库空值概念的深入思考。


问题

在测试中,有一个观点是需要验证字段是否能接受空值。当我们试图将item_name设为空时,发现事情并不简单。问题根源在于,item_name字段被设定为NOT NULL,意味着数据库不允许存储空值。但是,这种情况似乎与人类直觉不符,既然字段不能为null,那为什么还能设为空呢?


解决方案

通过与数据库团队的合作,我们找到了一个解决方法。通过执行一个UPDATE语句,将某一特定用户的item_name设为空字符串(""),我们发现即使字段为NOT NULL,也能顺利执行更新。这让人感到意外,但也验证了事实:在PostgreSQL中,空字符串并非同义词于NULL。


理由

通过进一步调查,我们了解到空字符串和空值在数据库中是两个不同的概念。在PostgreSQL中,空字符串""被视为一个长度为0的空值,但与NULL类型不同。虽然item_name字段为NOT NULL,但插入空字符串仍然是允许的,因为空字符串被视为一个有效的值,而不是NULL。

这一发现帮助我们理解了空值与空字符串的区别,从而避免了可能导致的逻辑错误。


扩展

关于数据库的空字符串处理逻辑,不同数据库系统之间存在差异。在实际开发中,认识这些差异至关重要。以下是对几种主要数据库的处理方式的简要分析:

1. Oracle(PL/SQL)

在Oracle中,空字符串与NULL被视为等价。因此,检查空字符串时应使用IS NULL而非直接比较符号。例如,使用IF col IS NULL才能够准确判断某列是否为空。

2. Microsoft SQL Server(T-SQL)

在MSSQL中,空字符串被视为空值,但默认情况下,空字符串不与NULL等价。可以通过IS NULL判断是否为空,同时LEN('')会返回0。此外,MSSQL支持使用空字符串与其他字符串进行操作,无需额外处理。

3. Sybase

Sybase与Oracle类似,空字符串不被视为空值,但其处理方式与MSSQL略有不同。在Sybase中,空字符串被视为空值,但LEN('')会返回1,这可能会导致字符串拼接时出现不必要的空白字符。


本文以PL/SQL和T-SQL为例,探讨了数据库中空字符串与空值的区别,旨在帮助开发者更好地理解不同数据库系统的差异。

转载地址:http://tqwzk.baihongyu.com/

你可能感兴趣的文章
python+locust电商全流程性能测试
查看>>
Python函数运行的可执行文件的终端输出如何以一般方式静音?
查看>>
Python+Pytest+Allure+Git+Jenkins接口自动化框架
查看>>
python+pytest接口自动化 —— 参数关联
查看>>
python+pytest接口自动化 —— 参数关联
查看>>
Python+pytest接口自动化 —— 接口测试基础
查看>>
python+pytest接口自动化 —— 自动化用例编写思路 (使用pytest编写一个测试脚本)
查看>>
Python+pytest接口自动化之cookie绕过登录(保持登录状态)
查看>>
python+pytest接口自动化:接口测试
查看>>
Python+requests+unittest执行接口自动化测试详情
查看>>
Python+requests+unittest执行接口自动化测试详情
查看>>
python+requests+unittest执行自动化接口测试!
查看>>
Python+Requests编码识别Bug
查看>>
python函数编写_[零基础学python]传说中的函数编写条规
查看>>
Python+selenium —— UI自动化之鼠标操作
查看>>
python函数注释,参数后面加冒号:,函数后面的箭头→是什么?
查看>>
Python+Selenium+Threading进行兼容性测试
查看>>
Python+selenium+unittest的GUI自动化框架实现
查看>>
python函数拟合不规则曲线_Python计算&绘图——曲线拟合问题(转)
查看>>
python函数定义的基本格式_零基础学python-2.19 定义函数、调用函数与默认参数
查看>>