Oracle中null值和空字符串的坑及解決
思考
在學(xué)習(xí)oracle數(shù)據(jù)庫的過程中,發(fā)現(xiàn)當(dāng)對字段進(jìn)行約束,默認(rèn)空字符串時(shí),出現(xiàn)報(bào)錯(cuò)

--創(chuàng)建employees表 CREATE TABLE employees ( id NUMBER, name VARCHAR2(100) ); --對表新增email列,添加約束默認(rèn)空字符串并且非空 ALTER TABLE employees ADD email VARCHAR2(100) DEFAULT '' NOT NULL;
以上操作的預(yù)期是向employees表中添加數(shù)據(jù),email不添加數(shù)據(jù)的時(shí)候默認(rèn)是空字符串,但實(shí)際上無法添加成功。
在MySQL數(shù)據(jù)庫中
--創(chuàng)建表employees CREATE TABLE employees( id int, name VARCHAR(100) ); --添加字段email,并添加約束 ALTER TABLE employees ADD email VARCHAR(100) DEFAULT '' NOT NULL;
- 向表中添加數(shù)據(jù)
--emial字段沒有添加,默認(rèn)為空字符串,不是null INSERT INTO employees (id,name) VALUES (1,'TOM'); INSERT INTO employees VALUES (2,'Carl',''); --email添加一個(gè)值 INSERT INTO employees VALUES (3,'Jhon','123@qq.com'); --查詢結(jié)果 mysql> SELECT * FROM employees; +------+------+------------+ | id | name | email | +------+------+------------+ | 1 | TOM | | | 2 | Carl | | | 3 | Jhon | 123@qq.com | +------+------+------------+ 3 rows in set (0.00 sec)
在MySQL數(shù)據(jù)庫中符合預(yù)期,email字段有數(shù)值時(shí),是實(shí)際的數(shù)值,相反是默認(rèn)的值。
- 修改約束
ALTER TABLE employees modify email VARCHAR(100);
- 添加數(shù)據(jù)
INSERT INTO employees (id,name) VALUES (1,'TOM'); INSERT INTO employees VALUES (2,'Carl','');
- 查看結(jié)果
mysql> SELECT * FROM employees; +------+------+-------+ | id | name | email | +------+------+-------+ | 1 | TOM | NULL | | 2 | Carl | | +------+------+-------+ 2 rows in set (0.00 sec)
MySQL中空字符串就是空字符串,空值就是NULL
在Oracle數(shù)據(jù)庫中
--創(chuàng)建表 CREATE TABLE employees ( id NUMBER, name VARCHAR2(100) ); --新增email字段,添加約束 ALTER TABLE employees ADD email VARCHAR2(100) DEFAULT '' NOT NULL;
- 向表中添加數(shù)據(jù)報(bào)錯(cuò)
INSERT INTO employees (id,name) VALUES (1,'TOM'); INSERT INTO employees VALUES (2,'Carl','');

- 修改約束
--修改email的約束,改成可以添加空值 ALTER TABLE employees MODIFY email varchar2(100) ; --插入數(shù)據(jù) INSERT INTO employees (id,name,email) VALUES (1,'TOM',''); --添加空字符串 INSERT INTO employees VALUES (2,'Carl',null);
查詢結(jié)果,結(jié)果都是null

原因是因?yàn)樵贠racle中,將長度為零的字符值視為NULL
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決ORA-12154 TNS無法解析指定的連接標(biāo)識符問題
Oracle11g server 64bit服務(wù)器端安裝在Windows Server2008 Enterprise上,安裝Oracle11g client 32bit,通過SQL Plus以sysdba身份連接數(shù)據(jù)庫,并且創(chuàng)建表空間、用戶、授權(quán)成功,在連接數(shù)據(jù)庫時(shí)出現(xiàn)問題,下面講解ORA-12154無法解析指定的連接標(biāo)識符問題,感興趣的朋友一起看看2024-01-01
Oracle使用fy_recover_data恢復(fù)truncate刪除的數(shù)據(jù)
這篇文章主要介紹了Oracle使用fy_recover_data恢復(fù)truncate刪除的數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
Oracle 臨時(shí)表空間SQL語句的實(shí)現(xiàn)
臨時(shí)表空間用來管理數(shù)據(jù)庫排序操作以及用于存儲臨時(shí)表、中間排序結(jié)果等臨時(shí)對象,本文主要介紹了Oracle 臨時(shí)表空間SQL語句的實(shí)現(xiàn),感興趣的可以了解一下2021-09-09
使用oracle發(fā)生標(biāo)識符無效問題及解決
這篇文章主要介紹了使用oracle發(fā)生標(biāo)識符無效問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Linux虛擬機(jī)下安裝Oracle 11G教程圖文解說
這篇文章主要介紹了Linux虛擬機(jī)下安裝Oracle 11G教程圖文詳解,本文文字圖解相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
oracle正則表達(dá)式regexp_like的用法詳解
本篇文章是對oracle正則表達(dá)式regexp_like的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

