Database design: When to use NULL vs default values in SQL

I’m currently developing a database and facing a problem. Should I use NULL values for my fields or is it best to apply default values instead?

For instance, take a look at this user table:

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    phone_number VARCHAR(20),
    registration_date DATE DEFAULT CURRENT_DATE,
    status VARCHAR(20) DEFAULT 'active'
);

Compared to this version:

CREATE TABLE members (
    member_id INT PRIMARY KEY,
    login_name VARCHAR(50) NOT NULL,
    email_address VARCHAR(100) DEFAULT NULL,
    mobile_phone VARCHAR(20) DEFAULT NULL,
    signup_date DATE DEFAULT CURRENT_DATE,
    account_status VARCHAR(20) DEFAULT NULL
);

What are the benefits and drawbacks of both methods? I would like to grasp the differences before I finalize my design.

Choosing between NULL and default values comes down to your business logic and what the data actually means. NULL means ‘no information here’ while defaults assume something specific when nothing’s provided. I’ve built a bunch of customer databases and learned that meaningful defaults work great for operational stuff like status fields or timestamps, but they can hide data quality problems. Say you default a phone number to an empty string - now you can’t tell if someone never gave you their number or gave you a bad one. I use NULL for optional contact info and personal details where missing data actually tells you something. Makes data validation way easier and helps with business rules - you can spot incomplete profiles or set up conditional requirements without guessing. But think about how you’ll query the data. NULLs need IS NULL/IS NOT NULL handling, while defaults work with normal queries. Also, some apps treat NULL differently than empty strings, which can bite you if you’re not consistent across your codebase.

depends on your app logic. three-value logic with nulls (true/false/unknown) trips up a lot of devs. defaults can hide bugs though - you think you’re getting real data but it’s just placeholder values. nulls are more space-efficient than default strings in most databases.

what reports you think about? nulls can really mess up aggregations. like for user engagement, do u want missing phone numbers as zeros or just ignored? also, are u using an ORM or raw SQL?