前言:
前两天,有一个数据库的表添加了一个字段 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!
这个逻辑引起的最大麻烦是在字符串相加时,引起头或尾部不必要的空格,导致相关逻辑失败!