Oracle is very very very old. Back in 80's when it was developed (and before there were any standards) they thought is was a good idea, and given then way Oracle stores its values, it really was. Here's how Oracle stores data (taken from the documentation): No datatype is stored within the data, only the data length and the data itself.
If the NULL occurs between two columns with values, it's stored as a single byte meaning column has length 0 (actually, 0xFF). Trailing NULLs are not stored at all. So to store the value 'test', Oracle needs to store 5 bytes: 04 74 65 73 74.
However, to store both an empty string and a NULL, Oracle just needs to set data length to 0. Very smart if your data are to be stored on 20 Mb hard drives that cost 5,000$ each. Later, when the standards appeared, it wasn't such a good idea anymore, but by that time there already were lots and lots of code relying on NULL and '' being the same thing.
Making VARCHAR to do such a distinction will break tons of code. To fix it, they renamed VARCHAR to VARCHAR2 (which is not a part of any standard), stated that VARCHAR2 will never distinguish between a NULL and an empty string and urged everybody to use this datatype instead. Now they are probably waiting for the last person who used a VARCHAR in Oracle database to die.
– Steve B. Aug 12 '09 at 19:30 1 Cost! = quality.
I have never used Oracle, but check out Lotus Notes. That software also costs a lot of $$$, but few people would say that it is a high quality application. – Ed S.
Aug 12 '09 at 19:33 +1 "waiting for the last person to die"... I can just picture it... – Steve B. Aug 12 '09 at 21:42 3 @Steve It's an issue of backward compatibility. This behaviour brings some problems for new development, but changing it to null!
= empty string would bring thousands times more problems with code suddenly not functioning properly after upgrade to a new Oracle version. – Michal Pravda Aug 13 '09 at 6:02 excellent explanation. – Mark Harrison Aug 13 '09 at 7:52.
You might want to read this lenghty and at times funny discussion about this exact subject more than two years ago on OTN: forums.oracle.com/forums/thread.jspa?thr... Regards, Rob.
Nice discussion! – Quassnoi Aug 12 '09 at 20:38.
Looks like Oracle have said that this behaviour may be change in a future release. When and which release it will be is not mentioned. If you have access to metalink look at note: 1011340.6 (unfortunately because of restrictions I am unable to copy the contents of the note here) If you don't have access to metalink then look look at the following from the 10g release 2 documentation here.
Ian, a reply to you. Oracle triggers can reference the table they are created on: create table t (id number(10) ); create or replace trigger t_bir before insert on t for each row declare l_id t. Id%type; begin select id into l_id from t where id = :new.Id; exception when no_data_found then null; end; / SQL> insert into t values (20); 1 row is created.
SQL> select * from t; ID ---------- 20.
Tuinstoel: only because you are using the VALUES clause. If you switch to the INSERT SELECT: SQL> insert into t select 20 from dual; insert into t select 20 from dual * ERROR at line 1: ORA-04091: table RWIJK. T is mutating, trigger/function may not see it ORA-06512: at "RWIJK.
T_BIR", line 4 ORA-04088: error during execution of trigger 'RWIJK. T_BIR' – Rob van Wijk Aug 12 '09 at 21:10 -------- I know. – tuinstoel Aug 12 '09 at 21:12.
Which is why smart people like Date say that you should NEVER use nulls. (No, I have to be precise. It's in fact only just a single one of the almost hundreds of reasons he has mentioned over this past few decades to support that claim.) EDIT I actually also wanted to respond to this : "Making VARCHAR to do such a distinction will break tons of code.
" Yeah, and surely, breaking at least the spirit of the standard by replacing the "empty string" by null on every update is a lesser evil? (Note : null is not equal to anything, not even itself, so after assigning the empty string to a column, oracle will give you a value in that column that is NOT the same as the value that you said you wanted to appear there.Wow.).
I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.