diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
index 128780f..c70603c 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
@@ -36,6 +36,15 @@ class Connection extends DatabaseConnection {
    */
   protected $needsCleanup = FALSE;
 
+  /**
+   * The character set of this connection.
+   * 
+   * Either utf8 or utf8mb4, but this could be extended to other charsets.
+   *
+   * @var string
+   */
+  protected $charset = 'utf8';
+
   public function __construct(array $connection_options = array()) {
     // This driver defaults to transaction support, except if explicitly passed FALSE.
     $this->transactionSupport = !isset($connection_options['transactions']) || ($connection_options['transactions'] !== FALSE);
@@ -69,14 +78,19 @@ public function __construct(array $connection_options = array()) {
 
     parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']);
 
-    // Force MySQL to use the UTF-8 character set. Also set the collation, if a
-    // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
-    // for UTF-8.
+    // Apply user-defined charset for this connection if set for utf8mb4 support
+    // (see sites/default/default.settings.php for more on utf8mb4 support).
+    if (isset($connection_options['charset'])) {
+      $this->charset = $connection_options['charset'];
+    }
+    else {
+      $this->charset = 'utf8';
+    }
     if (!empty($connection_options['collation'])) {
-      $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
+      $this->exec('SET NAMES ' . $this->charset . ' COLLATE ' . $connection_options['collation']);
     }
     else {
-      $this->exec('SET NAMES utf8');
+      $this->exec('SET NAMES ' . $this->charset);
     }
 
     // Set MySQL init_commands if not already defined.  Default Drupal's MySQL
@@ -236,6 +250,19 @@ protected function popCommittableTransactions() {
       }
     }
   }
+
+  /**
+   * Fetch the current character set for this connection.
+   * 
+   * Drupal defaults to use 3-byte UTF-8 with MySQL, but as of MySQL 5.5.3 it is
+   * possible to use full 4-byte UTF-8 (utf8mb4). See the documentation in 
+   * sites/default/default.settings.php on how to change this setting.
+   * 
+   * @return string
+   */
+  public function charset() {
+    return $this->charset;
+  }
 }
 
 
diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php b/core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
index 0f09aae..0f3085f 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Install/Tasks.php
@@ -82,4 +82,21 @@ protected function connect() {
     }
     return TRUE;
   }
+
+  /**
+   * Validates settings, specifically the character set.
+   */
+  public function validateDatabaseSettings($database) {
+    // Perform standard validation.
+    $errors = parent::validateDatabaseSettings($database);
+
+    // If we are using utf8mb4 charset, make sure the database supports it.
+    if (isset($database['charset']) && $database['charset'] == 'utf8mb4') {
+      if (!db_query("SHOW CHARACTER SET WHERE Charset = 'utf8mb4'")->rowCount()) {
+        $errors['mysql_charset'] = st('Your database does not support the utf8mb4 character set');
+      }
+    }
+
+    return $errors;
+  }
 }
diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php
index d88633f..01f07de 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php
@@ -156,6 +156,12 @@ protected function createFieldSql($name, $spec) {
       $sql .= ' unsigned';
     }
 
+    // If it's a text field, check to see if we should use utf8mb4 (4-byte UTF8)
+    // as the character set.
+    if (in_array($spec['mysql_type'], array('TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT', 'TEXT')) && Database::getConnection()->charset() == 'utf8mb4') {
+      $sql .= ' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci';
+    }
+
     if (isset($spec['not null'])) {
       if ($spec['not null']) {
         $sql .= ' NOT NULL';
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index 4c1239a..595ccf9 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -165,6 +165,22 @@
  * @endcode
  * NOTE: MySQL and SQLite's definition of a schema is a database.
  *
+ * By default MySQL only uses a 3-byte UTF8 character set. This can cause
+ * problems when trying to save data that contains high-order UTF8 characters,
+ * such as math symbols and rarer languages. If you have MySQL 5.5.3+, you can
+ * turn on support for 4-byte UTF8 characters in text fields by enabling the
+ * utf8mb4 character set on all text columns. More information on utf8mb4 can be
+ * found here:
+ * http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
+ *
+ * An example of using the utf8mb4 character set:
+ *
+ * @code
+ * $databases['default']['default'] = array(
+ *   'charset' => 'utf8mb4'
+ * );
+ * @endcode
+ *
  * Advanced users can add or override initial commands to execute when
  * connecting to the database server, as well as PDO connection settings. For
  * example, to enable MySQL SELECT queries to exceed the max_join_size system
