WordPress.org

Make WordPress Core

Ticket #21212: 21212.diff

File 21212.diff, 5.7 KB (added by pento, 5 years ago)
  • src/wp-includes/wp-db.php

     
    624624                        }
    625625                }
    626626
    627                 $this->init_charset();
    628 
    629627                $this->dbuser = $dbuser;
    630628                $this->dbpassword = $dbpassword;
    631629                $this->dbname = $dbname;
     
    727725
    728726                if ( defined( 'DB_CHARSET' ) )
    729727                        $this->charset = DB_CHARSET;
     728
     729                if ( 'utf8' === $this->charset && $this->has_cap( 'utf8mb4' ) ) {
     730                        $this->charset = 'utf8mb4';
     731                }
     732
     733                if ( 'utf8mb4' === $this->charset && ( ! $this->collate || stripos( $this->collate, 'utf8_' ) === 0 ) ) {
     734                        $this->collate = 'utf8mb4_unicode_ci';
     735                }
    730736        }
    731737
    732738        /**
     
    14771483                        return false;
    14781484                } else if ( $this->dbh ) {
    14791485                        $this->has_connected = true;
     1486
     1487                        $this->init_charset();
    14801488                        $this->set_charset( $this->dbh );
     1489
    14811490                        $this->ready = true;
    14821491                        $this->set_sql_mode();
    14831492                        $this->select( $this->dbname, $this->dbh );
     
    23532362                        'gb2312'  => 'EUC-CN',
    23542363                        'ujis'    => 'EUC-JP',
    23552364                        'utf32'   => 'UTF-32',
    2356                         'utf8mb4' => 'UTF-8',
    23572365                );
    23582366
    23592367                $supported_charsets = array();
     
    23882396                                }
    23892397                        }
    23902398
    2391                         // utf8(mb3) can be handled by regex, which is a bunch faster than a DB lookup.
    2392                         if ( 'utf8' === $charset || 'utf8mb3' === $charset ) {
     2399                        // utf8 can be handled by regex, which is a bunch faster than a DB lookup.
     2400                        if ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) {
    23932401                                $regex = '/
    23942402                                        (
    23952403                                                (?: [\x00-\x7F]                  # single-byte sequences   0xxxxxxx
     
    23972405                                                |   \xE0[\xA0-\xBF][\x80-\xBF]   # triple-byte sequences   1110xxxx 10xxxxxx * 2
    23982406                                                |   [\xE1-\xEC][\x80-\xBF]{2}
    23992407                                                |   \xED[\x80-\x9F][\x80-\xBF]
    2400                                                 |   [\xEE-\xEF][\x80-\xBF]{2}
    2401                                                 ){1,50}                          # ...one or more times
     2408                                                |   [\xEE-\xEF][\x80-\xBF]{2}';
     2409
     2410                                if ( 'utf8mb4' === $charset) {
     2411                                        $regex .= '
     2412                                                |    \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
     2413                                                |    [\xF1-\xF3][\x80-\xBF]{3}
     2414                                                |    \xF4[\x80-\x8F][\x80-\xBF]{2}
     2415                                        ';
     2416                                }
     2417
     2418                                $regex .= '){1,50}                          # ...one or more times
    24022419                                        )
    24032420                                        | .                                  # anything else
    24042421                                        /x';
  • src/wp-admin/includes/upgrade.php

     
    442442        if ( $wp_current_db_version < 29630 )
    443443                upgrade_400();
    444444
     445        if ( $wp_current_db_version < 30134 )
     446                upgrade_420();
     447
    445448        maybe_disable_link_manager();
    446449
    447450        maybe_disable_automattic_widgets();
     
    13291332}
    13301333
    13311334/**
     1335 * Execute changes made in WordPress 4.2.0.
     1336 *
     1337 * @since 4.2.0
     1338 */
     1339function upgrade_420() {
     1340        global $wp_current_db_version, $wpdb;
     1341        if ( $wp_current_db_version < 30134 && $wpdb->charset === 'utf8mb4') {
     1342                if ( is_multisite() ) {
     1343                        $tables = $wpdb->tables;
     1344                } else {
     1345                        $tables = array_merge( $wpdb->tables, $wpdb->global_tables );
     1346                }
     1347
     1348                foreach ( $tables as $table ) {
     1349                        $wpdb->query( "ALTER TABLE {$wpdb->$table} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" );
     1350                }
     1351        }
     1352}
     1353
     1354/**
    13321355 * Execute network level changes
    13331356 *
    13341357 * @since 3.0.0
     
    14241447                        update_site_option( 'illegal_names', $illegal_names );
    14251448                }
    14261449        }
     1450
     1451        // 4.2
     1452        if ( $wp_current_db_version < 30134 && $wpdb->charset === 'utf8mb4') {
     1453                $tables = array_merge( $wpdb->ms_global_tables, $wpdb->global_tables );
     1454
     1455                foreach ( $tables as $table ) {
     1456                        $wpdb->query( "ALTER TABLE {$wpdb->$table} CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" );
     1457                }
     1458        }
    14271459}
    14281460
    14291461// The functions we use to actually do stuff
  • src/wp-admin/setup-config.php

     
    280280                        case 'DB_HOST'     :
    281281                                $config_file[ $line_num ] = "define('" . $constant . "'," . $padding . "'" . addcslashes( constant( $constant ), "\\'" ) . "');\r\n";
    282282                                break;
     283                        case 'DB_CHARSET'  :
     284                                if ( 'utf8mb4' === $wpdb->charset || ( ! $wpdb->charset && $wpdb->has_cap( 'utf8mb4' ) ) ) {
     285                                        $config_file[ $line_num ] = "define('" . $constant . "'," . $padding . "'utf8mb4');\r\n";
     286                                }
     287                                break;
    283288                        case 'AUTH_KEY'         :
    284289                        case 'SECURE_AUTH_KEY'  :
    285290                        case 'LOGGED_IN_KEY'    :
  • tests/phpunit/tests/db/charset.php

     
    130130        }
    131131
    132132        /**
    133          * @ ticket 21212
     133         * @ticket 21212
    134134         */
    135135        function test_process_fields_failure() {
    136136                global $wpdb;
    137                 $data = array( 'post_content' => "H€llo\xf0\x9f\x98\x88World¢" );
     137                // \xf0\xff\xff\xff is invalid in utf8 and utf8mb4
     138                $data = array( 'post_content' => "H€llo\xf0\xff\xff\xffWorld¢" );
    138139                $this->assertFalse( self::$_wpdb->process_fields( $wpdb->posts, $data, null ) );
    139140        }
    140141
     
    436437         */
    437438        function test_invalid_characters_in_query() {
    438439                global $wpdb;
    439                 $this->assertFalse( $wpdb->query( "INSERT INTO {$wpdb->posts} (post_content) VALUES ('foo\xf0\x9f\x98\x88bar')" ) );
     440                $this->assertFalse( $wpdb->query( "INSERT INTO {$wpdb->posts} (post_content) VALUES ('foo\xf0\xff\xff\xffbar')" ) );
    440441        }
    441442}
  • src/wp-includes/version.php

     
    1111 *
    1212 * @global int $wp_db_version
    1313 */
    14 $wp_db_version = 30133;
     14$wp_db_version = 30134;
    1515
    1616/**
    1717 * Holds the TinyMCE version