postgre数据库下的 NOT NULL 和 空串(虽然有NOT NULL设定,但是可以插入空串'')

24 篇文章 1 订阅
4 篇文章 0 订阅

前言:

前两天,有一个数据库的表添加了一个字段 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!

这个逻辑引起的最大麻烦是在字符串相加时,引起头或尾部不必要的空格,导致相关逻辑失败!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值