Oracle中null值和空字符串的坑和解决方法
思考
在学习oracle数据库的过程中,发现当对字段进行约束,默认空字符串时,出现报错

1 2 3 4 5 6 7 | CREATE TABLE employees (
id NUMBER,
name VARCHAR2(100)
);
ALTER TABLE employees ADD email VARCHAR2(100) DEFAULT '' NOT NULL ;
|
以上操作的预期是向employees表中添加数据,email不添加数据的时候默认是空字符串,但实际上无法添加成功。
在MySQL数据库中
1 2 3 4 5 6 7 | CREATE TABLE employees(
id int ,
name VARCHAR (100)
);
ALTER TABLE employees ADD email VARCHAR (100) DEFAULT '' NOT NULL ;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | INSERT INTO employees (id, name ) VALUES (1, 'TOM' );
INSERT INTO employees VALUES (2, 'Carl' , '' );
INSERT INTO employees VALUES (3, 'Jhon' , '123@qq.com' );
mysql> SELECT * FROM employees;
+
| id | name | email |
+
| 1 | TOM | |
| 2 | Carl | |
| 3 | Jhon | 123@qq.com |
+
3 rows in set (0.00 sec)
|
在MySQL数据库中符合预期,email字段有数值时,是实际的数值,相反是默认的值。
1 | ALTER TABLE employees modify email VARCHAR (100);
|
1 2 | INSERT INTO employees (id, name ) VALUES (1, 'TOM' );
INSERT INTO employees VALUES (2, 'Carl' , '' );
|
1 2 3 4 5 6 7 8 | mysql> SELECT * FROM employees;
+
| id | name | email |
+
| 1 | TOM | NULL |
| 2 | Carl | |
+
2 rows in set (0.00 sec)
|
MySQL中空字符串就是空字符串,空值就是NULL
在Oracle数据库中
1 2 3 4 5 6 7 | CREATE TABLE employees (
id NUMBER,
name VARCHAR2(100)
);
ALTER TABLE employees ADD email VARCHAR2(100) DEFAULT '' NOT NULL ;
|
1 2 | INSERT INTO employees (id, name ) VALUES (1, 'TOM' );
INSERT INTO employees VALUES (2, 'Carl' , '' );
|

1 2 3 4 5 | ALTER TABLE employees MODIFY email varchar2(100) ;
INSERT INTO employees (id, name ,email) VALUES (1, 'TOM' , '' );
INSERT INTO employees VALUES (2, 'Carl' , null );
|
查询结果,结果都是null

原因是因为在Oracle中,将长度为零的字符值视为NULL