They are also different from a design perspective: e.g. CREATE TABLE t ( id INTEGER NOT NULL, name CHARACTER(40), CONSTRAINT t_PK PRIMARY KEY (id) ); CREATE UNIQUE INDEX t_AK1 ON t (name); ---------- Looks like: \d t Table "public.t" Column | Type | Modifiers --------+---------------+----------- id | integer | not null name | character(40) | Indexes: "t_pk" PRIMARY KEY, btree (id) "t_ak1" UNIQUE, btree (name) ------- Lets insert some data: op=# insert into t(id, name ) values ( 1, 'Hello'); INSERT 0 1 op=# insert into t( id, name) values ( 2, ''); INSERT 0 1 op=# insert into t( id, name) values ( 3, ''); ERROR: duplicate key value violates unique constraint "t_ak1" ---------- Now lets try with null: op=# insert into t( id, name) values (4, null ); INSERT 0 1 op=# insert into t( id, name) values (5, null); INSERT 0 1 This is allowed. Soooooo: nulls are not trivial strings nor the reverse. Cheers