Eu não sei sobre MySQL e PostgreSQL, mas deixe-me tratar isso um pouco em geral.
Existe um DBMS, ou seja, o Oracle, que não permite escolher seus usuários entre NULL e ''. Isso demonstra claramente que não é necessário distinguir entre ambos. Existem algumas consequências irritantes:
Você define um varchar2 como uma string vazia como esta:
Update mytable set varchar_col = '';
o seguinte leva ao mesmo resultado
Update mytable set varchar_col = NULL;
Mas, para selecionar as colunas em que o valor está vazio ou NULL, você deve usar
select * from mytable where varchar_col is NULL;
Usando
select * from mytable where varchar_col = '';
está sintaticamente correto, mas nunca retorna uma linha.
Por outro lado, ao concatenar seqüências de caracteres no Oracle. Varchar NULL são tratados como cadeias vazias.
select NULL || 'abc' from DUAL;
produz abc . Outros DBMS retornariam NULL nesses casos.
Quando você deseja expressar explicitamente que um valor é atribuído, é necessário usar algo como ''.
E você precisa se preocupar se o corte não vazio resulta em NULL
select case when ltrim(' ') is null then 'null' else 'not null' end from dual
Faz.
Agora, olhando para o DBMS onde '' não é idêntico ao NULL (por exemplo, SQL-Server)
Trabalhar com '' é geralmente mais fácil e, na maioria dos casos, não há necessidade prática de distinguir entre os dois. Uma das exceções que eu conheço é quando sua coluna representa alguma configuração e você não possui padrões vazios para elas. Quando você pode distinguir entre '' e NULL, é possível expressar que sua configuração está vazia e evitar que o padrão se aplique.
NULL
ou não