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!

這個邏輯引起的最大麻煩是在字符串相加時,引起頭或尾部不必要的空格,導致相關邏輯失敗!





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com