[wp-trac] [WordPress Trac] #8857: Make WP MySQL strict mode compliant
WordPress Trac
noreply at wordpress.org
Mon Apr 7 10:16:12 UTC 2025
#8857: Make WP MySQL strict mode compliant
-------------------------+-----------------------
Reporter: ghostks | Owner: (none)
Type: enhancement | Status: reopened
Priority: lowest | Milestone:
Component: Database | Version: 6.4.2
Severity: normal | Resolution:
Keywords: | Focuses:
-------------------------+-----------------------
Changes (by saurabh.dhariwal):
* status: closed => reopened
* resolution: invalid =>
Comment:
Replying to [comment:24 saurabh.dhariwal]:
> This error message highlights a known compatibility issue between
**WordPress** and **MySQL** when **strict SQL modes** are enabled —
specifically when modes like `NO_ZERO_DATE` or `STRICT_ALL_TABLES` are
active. These modes prevent inserting default date/datetime values like
`'0000-00-00'` or `'0000-00-00 00:00:00'`, which WordPress still uses in
some parts of its schema.
>
> ✅ Explanation
> WordPress, by default, uses zero dates like:
> - `'0000-00-00'` for `DATE`
> - `'0000-00-00 00:00:00'` for `DATETIME`
>
> But **MySQL in strict mode** doesn't allow this anymore, as it's not a
valid date per SQL standards. When your **MySQL server has strict mode
enabled**, these invalid defaults cause the WordPress installation to
fail.
>
> ---
>
> 🛠️ Solution Options
>
> **Option 1: Disable Strict Mode in MySQL**
> This is the most common workaround.
>
> 1. Edit your MySQL config file (`my.cnf` or `my.ini`)
> ```ini
> [mysqld]
> sql_mode=NO_ENGINE_SUBSTITUTION
> ```
> 2. Restart MySQL.
>
> Or, dynamically:
> ```sql
> SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';
> ```
>
> Check the current mode:
> ```sql
> SELECT @@sql_mode;
> ```
>
> > ⚠️ Be careful if you're on a shared host — you may not have access to
change SQL modes directly.
>
> ---
>
> **Option 2: Patch WordPress Core (Not Recommended)**
> Manually update the `wp-admin/includes/schema.php` and change default
values for `date`/`datetime` columns from `'0000-00-00'` to `NULL`. This
is **not recommended**, as updates to WordPress will override it.
>
> ---
>
> **Option 3: Use a MySQL Version with More Lenient Defaults**
> MySQL 5.6+ tends to enable stricter SQL modes by default. Using MariaDB
or an older MySQL version can avoid this — but again, not ideal or future-
proof.
>
>
> ---
>
> 💡 Best Practice (for Plugin/Theme Devs)
> If you're developing plugins or custom database tables:
> - Avoid using zero dates.
> - Use `NULL` as the default for `DATE`/`DATETIME` columns.
> - Always test your plugin/theme on strict MySQL setups.
--
Ticket URL: <https://core.trac.wordpress.org/ticket/8857#comment:25>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list