Project

General

Profile

Revision b0dc3a2e

Added by Julien Enselme over 7 years ago

Update to Drupal 7.52

View differences:

drupal7/includes/database/mysql/database.inc
28 28

  
29 29
    $this->connectionOptions = $connection_options;
30 30

  
31
    $charset = 'utf8';
32
    // Check if the charset is overridden to utf8mb4 in settings.php.
33
    if ($this->utf8mb4IsActive()) {
34
      $charset = 'utf8mb4';
35
    }
36

  
31 37
    // The DSN should use either a socket or a host/port.
32 38
    if (isset($connection_options['unix_socket'])) {
33 39
      $dsn = 'mysql:unix_socket=' . $connection_options['unix_socket'];
......
39 45
    // Character set is added to dsn to ensure PDO uses the proper character
40 46
    // set when escaping. This has security implications. See
41 47
    // https://www.drupal.org/node/1201452 for further discussion.
42
    $dsn .= ';charset=utf8';
48
    $dsn .= ';charset=' . $charset;
43 49
    $dsn .= ';dbname=' . $connection_options['database'];
44 50
    // Allow PDO options to be overridden.
45 51
    $connection_options += array(
......
63 69
    // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
64 70
    // for UTF-8.
65 71
    if (!empty($connection_options['collation'])) {
66
      $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
72
      $this->exec('SET NAMES ' . $charset . ' COLLATE ' . $connection_options['collation']);
67 73
    }
68 74
    else {
69
      $this->exec('SET NAMES utf8');
75
      $this->exec('SET NAMES ' . $charset);
70 76
    }
71 77

  
72 78
    // Set MySQL init_commands if not already defined.  Default Drupal's MySQL
......
206 212
      }
207 213
    }
208 214
  }
215

  
216
  public function utf8mb4IsConfigurable() {
217
    return TRUE;
218
  }
219

  
220
  public function utf8mb4IsActive() {
221
    return isset($this->connectionOptions['charset']) && $this->connectionOptions['charset'] === 'utf8mb4';
222
  }
223

  
224
  public function utf8mb4IsSupported() {
225
    // Ensure that the MySQL driver supports utf8mb4 encoding.
226
    $version = $this->getAttribute(PDO::ATTR_CLIENT_VERSION);
227
    if (strpos($version, 'mysqlnd') !== FALSE) {
228
      // The mysqlnd driver supports utf8mb4 starting at version 5.0.9.
229
      $version = preg_replace('/^\D+([\d.]+).*/', '$1', $version);
230
      if (version_compare($version, '5.0.9', '<')) {
231
        return FALSE;
232
      }
233
    }
234
    else {
235
      // The libmysqlclient driver supports utf8mb4 starting at version 5.5.3.
236
      if (version_compare($version, '5.5.3', '<')) {
237
        return FALSE;
238
      }
239
    }
240

  
241
    // Ensure that the MySQL server supports large prefixes and utf8mb4.
242
    try {
243
      $this->query("CREATE TABLE {drupal_utf8mb4_test} (id VARCHAR(255), PRIMARY KEY(id(255))) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ROW_FORMAT=DYNAMIC ENGINE=INNODB");
244
    }
245
    catch (Exception $e) {
246
      return FALSE;
247
    }
248
    $this->query("DROP TABLE {drupal_utf8mb4_test}");
249
    return TRUE;
250
  }
209 251
}
210 252

  
211 253

  

Also available in: Unified diff