Skip to content

[TASK][TRAC-13103] Check DB_CHARSET before installing WP Core#12087

Open
ramonfincken wants to merge 8 commits into
WordPress:trunkfrom
ramonfincken:trac-13103
Open

[TASK][TRAC-13103] Check DB_CHARSET before installing WP Core#12087
ramonfincken wants to merge 8 commits into
WordPress:trunkfrom
ramonfincken:trac-13103

Conversation

@ramonfincken

Copy link
Copy Markdown

Trac ticket: https://core.trac.wordpress.org/ticket/13103

This will check the DB_CHARSET compatibility upon installing, preventing a non-supported (defined) DB_CHARSET to be used in DB installer.

Based on 13103.patch (816 bytes) - added by SergeyBiryukov 14 years ago.
Updated for latest (current) trunk version of git-ified WP Core.

Use of AI Tools

None


This Pull Request is for code review only. Please keep all other discussion in the Trac ticket. Do not merge this Pull Request. See GitHub Pull Requests for Code Review in the Core Handbook for more details.

@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

Unlinked Accounts

The following contributors have not linked their GitHub and WordPress.org accounts: @ramon@creativepulses.nl, @ramon-fincken@chat.wordpress.org.

Contributors, please read how to link your accounts to ensure your work is properly credited in WordPress releases.

Core Committers: Use this line as a base for the props when committing in SVN:

Props ramon-fincken, mukesh27, mikachan.

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown

Test using WordPress Playground

The changes in this pull request can previewed and tested using a WordPress Playground instance.

WordPress Playground is an experimental project that creates a full WordPress instance entirely within the browser.

Some things to be aware of

  • All changes will be lost when closing a tab with a Playground instance.
  • All changes will be lost when refreshing the page.
  • A fresh instance is created each time the link below is clicked.
  • Every time this pull request is updated, a new ZIP file containing all changes is created. If changes are not reflected in the Playground instance,
    it's possible that the most recent build failed, or has not completed. Check the list of workflow runs to be sure.

For more details about these limitations and more, check out the Limitations page in the WordPress Playground documentation.

Test this pull request with WordPress Playground.

@mukeshpanchal27 mukeshpanchal27 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @ramonfincken for the PR!

Let some initial feedbacks

Comment thread src/wp-admin/install.php
Comment thread src/wp-admin/install.php Outdated
Comment thread src/wp-admin/install.php Outdated
Comment thread src/wp-admin/install.php Outdated

@mikachan mikachan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for working on this, @ramonfincken! I've left a few inline comments.

Comment thread src/wp-admin/install.php Outdated
Comment thread src/wp-admin/install.php Outdated
Comment thread src/wp-admin/install.php Outdated
Comment thread src/wp-admin/install.php Outdated
ramonfincken and others added 5 commits June 10, 2026 15:09
Co-authored-by: Sarah Norris <1645628+mikachan@users.noreply.github.com>
Co-authored-by: Sarah Norris <1645628+mikachan@users.noreply.github.com>
Co-authored-by: Sarah Norris <1645628+mikachan@users.noreply.github.com>
Co-authored-by: Sarah Norris <1645628+mikachan@users.noreply.github.com>
@ramonfincken ramonfincken requested a review from mikachan June 10, 2026 13:23

@mikachan mikachan left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the changes! I've left a couple more inline comments. I notice there are a few failing tests too, let's address those next.

Comment thread src/wp-admin/install.php
$mysql_db_charset_compat = false;

$compat = sprintf(
/* translators: %s: the value of the wp-config DB_CHARSET string. */

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/* translators: %s: the value of the wp-config DB_CHARSET string. */
/* translators: %s: the value of the wp-config DB_CHARSET string. */

Comment thread src/wp-admin/install.php
$compat = sprintf(
/* translators: %s: the value of the wp-config DB_CHARSET string. */
__( 'You cannot install because the DB_CHARSET defined in wp-config.php ("%s") is not supported by your database.' ),
DB_CHARSET

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just spotted that we have this DB_CHARSET reference on its own as well, which probably needs to be guarded too:

Suggested change
DB_CHARSET
defined( 'DB_CHARSET' ) ? DB_CHARSET : ''

Comment thread src/wp-admin/install.php
if ( ! defined( 'DB_CHARSET' ) || ! DB_CHARSET || ! $wpdb->get_row( $wpdb->prepare( 'SHOW CHARACTER SET WHERE Charset = %s', DB_CHARSET ) ) ) {
$mysql_db_charset_compat = false;

$compat = sprintf(

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like the $compat variable is shared across all three compatibility checks (PHP version, MySQL version, and now DB charset), but die() only renders it once. The existing check at lines 258-287 sets $compat to a version-mismatch message when either $php_compat or $mysql_compat is false. The new charset block then unconditionally re-assigns $compat whenever the charset check fails. So if someone has both an outdated PHP/MySQL version and an unsupported DB_CHARSET, the version error message is overwritten by the charset message before die() runs.

We should be able to address this by adding another guard before setting $compat here:

Suggested change
$compat = sprintf(
if ( $mysql_compat && $php_compat ) {
$compat = sprintf(
...

Or we could restructure this so each check has its own die(), and there's no shared variable to overwrite. What do you think?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants