diff --git a/src/wp-includes/wp-db.php b/src/wp-includes/wp-db.php index f4f0826897..cc33b217a0 100644 --- a/src/wp-includes/wp-db.php +++ b/src/wp-includes/wp-db.php @@ -779,6 +779,11 @@ class wpdb { $charset = 'utf8mb4'; } + if ( 'utf8mb4' === $charset && ! $this->has_cap( 'utf8mb4' ) ) { + $charset = 'utf8'; + $collate = str_replace( 'utf8mb4_', 'utf8_', $collate ); + } + if ( 'utf8mb4' === $charset ) { // _general_ is outdated, so we can upgrade it to _unicode_, instead. if ( ! $collate || 'utf8_general_ci' === $collate ) { diff --git a/tests/phpunit/tests/db.php b/tests/phpunit/tests/db.php index 7cff637149..0710965367 100644 --- a/tests/phpunit/tests/db.php +++ b/tests/phpunit/tests/db.php @@ -1031,4 +1031,23 @@ class Tests_DB extends WP_UnitTestCase { $this->assertSame( 'utf8mb4_swedish_ci', $result['collate'] ); } + + /** + * @ticket 37982 + */ + function test_charset_switched_to_utf8() { + global $wpdb; + + if ( $wpdb->has_cap( 'utf8mb4' ) ) { + $this->markTestSkipped( 'This test requires utf8mb4 to not be supported.' ); + } + + $charset = 'utf8mb4'; + $collate = 'utf8mb4_general_ci'; + + $result = $wpdb->determine_charset( $charset, $collate ); + + $this->assertSame( 'utf8', $result['charset'] ); + $this->assertSame( 'utf8_general_ci', $result['collate'] ); + } }