First: Consider closely the different semantics of NULL and Empty-String.
- The first is best interpreted as something like:
There is a valid value for this field, but that value is not yet known.
- The second always means:
The valid value for this field is known, and it is precisely "".
Second: Recognize that indexing and filtering works better and more efficiently on Empty-String than on NULL, so don't use the latter when you really mean the former.
Third: Recognize that all expressions that use NULL are susceptible to the non-intuitiveness of three-valued logic unless the NULL is religiously coalesced to Empty-String (or some other contextually valid value) first. In particular, the law of excluded middle no longer applies, so the expression A or ~A is no longer tautologically true whenever the evaluation of A requires evaluation of a NULL term. Forgetting this can lead to very subtle and hard-to-locate bugs.
The not-equals operator exposes this regularly:
When A has the value NULL:
The expression A = 0 returns false;
The expression A <> 0 returns false; and
The expression A OR NOT A returns false!
Update:
I guess the essence of my point is that they are NOT the same creature, but rather very different beasts. Each has its place. A second address field should always be non-null (unless you intend to allow entry of partial or incomplete addresses), and it's default should always be the valid and known value of Empty-String. NULL should be restricted to cases where a valid and known value will be supplied later, and in fact o signal some sort of validation failure that must be resolved.
From OP below:
A row will not be updated. On the insertion there is either an IP
address or there is none (because it could not be resolved).
Response:
Then I recommend using Empty-String as the default, and make the field NON-NULL. Only use NULL when you must, as it has subtle disadvantages.