postgre数据库下的 NOT NULL 和 空串(虽然有NOT NULL设定,但是可以插入空串'')
前言:
前两天,有一个数据库的表添加了一个字段 item_name.
并且设置了NOT NULL约束。
------------------------------------------------
于是问题发生了!!!
-------------------------------------------------
问题:
在测试中有一个观点是要测试这个字段的值是空值的情况。
但是这个字段怎么会是空值呢?
解决:
日方提供了一个SQL update TBL_name set item_name = "" WHERE 主键user_id = “xxxx”
发现还真的可以更新!!
-------------------------------------------------
原因:
于是上网调查了一下,在postgre中‘’并不代表空,而是代表空串。
‘’和null是两个概念。
扩展:
来源:http://wangbaoaiboy.blog.163.com/blog/static/5211191020117444535874/
不同数据库的空字符串处理逻辑
经历过不同数据库开发的人经常会对莫名其妙的空串处理逻辑搞的晕头转向。
本人在此对Oracle,MSSQL,Sybase三种数据库的空串处理逻辑所一点分析。
本文假设读者正在使用PL/SQL或者T-SQL。
1、ORACLE——PL/SQL
在PL/SQL中,空串与NULL被视为等价值。
以下是测试例子:
CREATE TABLE test_empty(name VARCHAR2(10) NOT NULL);
INSERT INTO test_empty VALUES('');
ORA-01400: cannot insert NULL into ("MY_DB"."TEST_EMPTY"."NAME")
因此,在PL/SQL中语句
IF v_name = '' THEN
实际上错误的。因为众所周知,判断是否为NULL应该用IS NULL。
那么,ORACLE中空串的长度是什么呢?
执行以下语句你将得到答案:
SELECT LENGTH('') from DUAL;
结果是0吗?不,是空值NULL!
这说明在Oracle不存在长度为0的字符串!
2、MSSQL——T-SQL
MSSQL真正将空串视为一个有意义的标识,即不是一个空值。
你可以顺利将空串插入一个NOT NULL的列中:
CREATE TABLE test_empty(name varchar(10) NOT NULL) ;
INSERT INTO test_empty VALUES('');
MSSQL将空串视作一个长度为0的字符串,与其他字符串没有本质区别。执行
SELECT LEN('')
其结果为0。
既然空串不是NULL,那么自然可以直接用=号进行判断。
3、Sybase
从直觉上讲,MSSQL脱胎于Sybase,因为两者的空串处理逻辑应该一样。但是实际并非如此。
与Oracle一样,Sybase中同样不存在长度为0的字符串,但是与Oracle不同的是,Sybase并不将空串视作NULL,而是视作与只包含一个空格的字符串等价。
因此,执行
SELECT LEN('')
其结果居然是1!
这个逻辑引起的最大麻烦是在字符串相加时,引起头或尾部不必要的空格,导致相关逻辑失败!
postgre数据库下的 NOT NULL 和 空串(虽然有NOT NULL设定,但是可以插入空串'')相关推荐
- XXL-Job 适配 Postgre 数据库的完整流程
背景 开源任务调度框架 XXL-Job 默认是基于 MySQL 数据库开发的,好在它是使用了 MyBatis ,要支持其他数据库,需要改 Mapping 映射文件,建表语句换成其他数据库的. 主要差异 ...
- 【2019-2020春学期】数据库作业9:SQL练习6 - INSERT / UPDATE / DELETE / NULL / VIEW
数据更新 一.插入数据 1.插入元组 语句格式: INSERT INTO <表名> [(<属性列1>[,<属性列2 >-)] VALUES (<常量1> ...
- mysql查询数据库结构_mysql查询数据库下的表结构
mysql查询数据库下的表结构 方法:1.使用DESCRIBE命令以表格的形式展示表结构,语法"DESCRIBE 表名;":2.使用"SHOW CREATE TABLE& ...
- postgre数据库
任务 实现一个数据接收的Server,接收数据后,存入队列,起多个消费者线程,消耗队列中的数据存入postgre数据库. 涉及到数据存储容量不断增大,使用分区表思路. 数据并行接收插入数据库的一些优化 ...
- linux mysql清除数据库所有表_MySQL修复指定数据库下的所有表
mysql,mariadb,percona 这几天数据库频繁crash,查看日志发现类似如下的错误: [ERROR] mysqld: Table './database/pre_forum_forum ...
- mysql查看某个数据库下的所有视图
mysql查看某个数据库下的所有视图 select count(1) from information_schema.TABLES where table_type='view' and TABLE_ ...
- SQL Server查询所有数据库下模式schema
SQL Server查询所有数据库下模式名 需求描述 找到SQL Server里所有数据库下的schema.输出格式为数据库名.模式名. 背景补充 关于SQL Server需要简单介绍下,从数据库对象 ...
- scala连接postgre数据库
因为企业上使用postgre timescale数据库来保存实时数据,所以在做spark任务时需要去连接postgre数据库,demo如下: val conn_str = "jdbc:pos ...
- mysql数据库计算全部女生_使用mysql存储过程-统计某个数据库下的所有表的记录数...
使用 mysql 存储过程 - 统计某个数据库下的所有表的记录数 其中用到了游标 (cursor) ,循环 (loop) ,动态 SQL 预处理 (prepare) 等技术,特 此记录一下. [sql ...
最新文章
- Python PIL反色混合
- matlab检验两个样本的,两样本独立T检验MATLAB代码
- windows和linux下,查看oracle SID的方法
- 拳王虚拟项目公社:闲鱼虚拟资源玩法案例拆解,教你玩转虚拟资源,货源+方法
- matlab 连通域数量,【Matlab】找到矩阵中每个连通域的最小值
- 最大流Dinic算法
- 西安Uber优步司机奖励政策(1月11日~1月17日)
- cron每两个小时_crontab 每隔 1 小时 2 小时的执行 job 写法
- 高等数学:微分、积分物理以及几何意义
- 齐治 堡垒机 mysql_齐治堡垒机:让数据库运维审计无死角
- NPOI导出一行多张图片
- Unity - 九宫格切图报错
- Stata:各类集中度指数估算-广义基尼Gini系数
- iOS开发中的锁实现猜测
- java面向对象基础练习1(坐标点移动)
- c语言 int与byte[]互相转换
- 设置元素旋转中心点(transform-origin)
- swing界面设计之登录注册界面
- JetBrains 推出全新数据科学 IDE——DataSpell
- 2021年企业引入人事管理系统还来得及吗?
热门文章
- 3. 机器学习中为什么需要梯度下降?梯度下降算法缺点?_一起学习西瓜书2
- Applying Rhetorical Structure Theory to Student Essays for Providing Automated Writing Feedback
- mysql 分类计数器,MYSQL计数器类型业务的优化
- jieba结巴分词--关键词抽取(核心词抽取)
- 主成分分析、因子分析和聚类分析的区别
- 程序员如何掌握计算机英语
- [HTML5实现人工智能]小游戏《井字棋》发布,据说IQ上200才能赢
- 关于C# 模仿千千静听 磁铁窗体 的个人的一个思路
- [转载]Qt之解决中文乱码_vortex_新浪博客
- if和else同时执行_为什么大量的if else这么不受待见?怎么“干掉”它?