WordPress.org

Make WordPress Core


Ignore:
Timestamp:
02/06/2015 04:50:19 AM (5 years ago)
Author:
pento
Message:

WPDB: If a site is using the utf8 charset, and their version of MySQL supports utf8mb4, auto-upgrade them to utf8mb4.

This patch also resizes some indexes, to allow for the 767 byte index size limit in standard MySQL installs.

See #21212

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/wp-db.php

    r31294 r31349  
    625625        }
    626626
    627         $this->init_charset();
    628 
    629627        $this->dbuser = $dbuser;
    630628        $this->dbpassword = $dbpassword;
     
    718716        if ( function_exists('is_multisite') && is_multisite() ) {
    719717            $this->charset = 'utf8';
    720             if ( defined( 'DB_COLLATE' ) && DB_COLLATE )
     718            if ( defined( 'DB_COLLATE' ) && DB_COLLATE ) {
    721719                $this->collate = DB_COLLATE;
    722             else
     720            } else {
    723721                $this->collate = 'utf8_general_ci';
     722            }
    724723        } elseif ( defined( 'DB_COLLATE' ) ) {
    725724            $this->collate = DB_COLLATE;
    726725        }
    727726
    728         if ( defined( 'DB_CHARSET' ) )
     727        if ( defined( 'DB_CHARSET' ) ) {
    729728            $this->charset = DB_CHARSET;
     729        }
     730
     731        if ( ( $this->use_mysqli && ! ( $this->dbh instanceof mysqli ) )
     732          || ( empty( $this->dbh ) || ! ( $this->dbh instanceof mysqli ) ) ) {
     733            return;
     734        }
     735
     736        if ( 'utf8' === $this->charset && $this->has_cap( 'utf8mb4' ) ) {
     737            $this->charset = 'utf8mb4';
     738        }
     739
     740        if ( 'utf8mb4' === $this->charset && ( ! $this->collate || stripos( $this->collate, 'utf8_' ) === 0 ) ) {
     741            $this->collate = 'utf8mb4_unicode_ci';
     742        }
    730743    }
    731744
     
    14771490            return false;
    14781491        } elseif ( $this->dbh ) {
     1492            if ( ! $this->has_connected ) {
     1493                $this->init_charset();
     1494            }
     1495
    14791496            $this->has_connected = true;
     1497
    14801498            $this->set_charset( $this->dbh );
     1499
    14811500            $this->ready = true;
    14821501            $this->set_sql_mode();
     
    22502269     *
    22512270     * @since 4.2.0
    2252      * @access protected
     2271     * @access public
    22532272     *
    22542273     * @param string $table  Table name.
     
    22572276     *               character set. {@see WP_Error} object if there was an error.
    22582277     */
    2259     protected function get_col_charset( $table, $column ) {
     2278    public function get_col_charset( $table, $column ) {
    22602279        $tablekey = strtolower( $table );
    22612280        $columnkey = strtolower( $column );
     
    23572376            'ujis'    => 'EUC-JP',
    23582377            'utf32'   => 'UTF-32',
    2359             'utf8mb4' => 'UTF-8',
    23602378        );
    23612379
     
    23922410            }
    23932411
    2394             // utf8(mb3) can be handled by regex, which is a bunch faster than a DB lookup.
    2395             if ( 'utf8' === $charset || 'utf8mb3' === $charset ) {
     2412            // utf8 can be handled by regex, which is a bunch faster than a DB lookup.
     2413            if ( 'utf8' === $charset || 'utf8mb3' === $charset || 'utf8mb4' === $charset ) {
    23962414                $regex = '/
    23972415                    (
     
    24012419                        |   [\xE1-\xEC][\x80-\xBF]{2}
    24022420                        |   \xED[\x80-\x9F][\x80-\xBF]
    2403                         |   [\xEE-\xEF][\x80-\xBF]{2}
    2404                         ){1,50}                          # ...one or more times
     2421                        |   [\xEE-\xEF][\x80-\xBF]{2}';
     2422
     2423                if ( 'utf8mb4' === $charset) {
     2424                    $regex .= '
     2425                        |    \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences   11110xxx 10xxxxxx * 3
     2426                        |    [\xF1-\xF3][\x80-\xBF]{3}
     2427                        |    \xF4[\x80-\x8F][\x80-\xBF]{2}
     2428                    ';
     2429                }
     2430
     2431                $regex .= '){1,50}                          # ...one or more times
    24052432                    )
    24062433                    | .                                  # anything else
Note: See TracChangeset for help on using the changeset viewer.