MySQL NULL Values
Use IS NULL and null-safe comparison when the data contract genuinely allows unknown values.
How it works
NULL represents a missing or unknown value, not an empty string or zero. Ordinary comparison with NULL produces UNKNOWN, so note = NULL does not select missing notes. The seed deliberately gives Canvas patch a NULL note and Cotton cord an empty string. These cases may need different treatment in an application. MySQL’s null-safe equality operator is available when equality must also define what happens for two NULL values.
Run in a disposable MySQL lab
Use Oracle MySQL 8.4 with InnoDB, not Bhylu’s SQLite playground. The examples were reviewed on MySQL 8.4.8. XAMPP may provide MariaDB, which has different feature and collation behaviour. Check your actual server before running the script. These lessons do not require a change to Bhylu’s PHP, Apache or normal database service.
- On a separate lab instance, create the empty bhylu_mysql_lab schema. Stop if it already exists; do not overwrite an existing database.
- Select that schema and import the complete repair-parts seed once. It sets the documented session mode, utf8mb4 collation, UTC and English date-name locale.
- Run this lesson in a fresh copy of the seed, not after another lesson’s writes. Use the command-line client or a compatible editor. DELIMITER lines are client instructions for stored-program examples.
Download this complete lesson script. Its setup is the linked seed; review the dataset before changing it. Administrative and destructive examples are restricted to the specifically named disposable objects. Every script repeats the session settings because each new connection has its own session. No MySQL browser runner is currently available.
Example
SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci;
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET SESSION time_zone = '+00:00';
SET SESSION lc_time_names = 'en_US';
SELECT id, note IS NULL AS missing,
note <=> NULL AS null_safe_match
FROM parts
WHERE note IS NULL OR note = ''
ORDER BY id;
Expected result
1 | 1 | 1 3 | 0 | 0
The missing note and empty note both pass the predicate, but the flags distinguish them. IS NULL is normally the clearest test for missing data. Use COALESCE only when a fallback is part of the requested display or calculation, not to silently erase the distinction in stored records. Constraints can forbid NULL where the domain requires a known value.
Use the official MySQL 8.4 reference for statement contracts and version details.