diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
index dd8c299..b2f244e 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
@@ -218,6 +218,13 @@ public function databaseType() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function escapeDatabase($database) {
+    return '`' . parent::escapeDatabase($database) . '`';
+  }
+
+  /**
    * Overrides \Drupal\Core\Database\Connection::createDatabase().
    *
    * @param string $database
diff --git a/core/lib/Drupal/Core/Database/Install/Tasks.php b/core/lib/Drupal/Core/Database/Install/Tasks.php
index 9879998..d33ec96 100644
--- a/core/lib/Drupal/Core/Database/Install/Tasks.php
+++ b/core/lib/Drupal/Core/Database/Install/Tasks.php
@@ -210,6 +210,7 @@ public function getFormOptions(array $database) {
     $form['database'] = array(
       '#type' => 'textfield',
       '#title' => t('Database name'),
+      '#description' => t('The database name can only contain alphanumeric characters, underscores or dots.'),
       '#default_value' => empty($database['database']) ? '' : $database['database'],
       '#size' => 45,
       '#required' => TRUE,
@@ -288,12 +289,18 @@ public function getFormOptions(array $database) {
    * @param $database
    *   An array of driver specific configuration options.
    *
-   * @return
+   * @return array
    *   An array of driver configuration errors, keyed by form element name.
    */
   public function validateDatabaseSettings($database) {
     $errors = array();
 
+    // @todo Implement #2644960: Specific DB name validation per DB driver.
+    // Verify there are no illegal characters in the database name.
+    if (!empty($database['database']) && preg_match('/[^a-zA-Z0-9_.]/', $database['database'])) {
+      $errors[$database['driver'] . '][database'] = t('The database name you have entered, %database, is invalid. The database name can only contain alphanumeric characters, underscores or dots.', array('%database' => $database['database']));
+    }
+
     // Verify the table prefix.
     if (!empty($database['prefix']) && is_string($database['prefix']) && !preg_match('/^[A-Za-z0-9_.]+$/', $database['prefix'])) {
       $errors[$database['driver'] . '][prefix'] = t('The database table prefix you have entered, %prefix, is invalid. The table prefix can only contain alphanumeric characters, periods, or underscores.', array('%prefix' => $database['prefix']));
diff --git a/core/tests/Drupal/Tests/Core/Database/Driver/mysql/Install/MysqlInstallTaskDatabaseNameTest.php b/core/tests/Drupal/Tests/Core/Database/Driver/mysql/Install/MysqlInstallTaskDatabaseNameTest.php
new file mode 100644
index 0000000..cc22e96
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Database/Driver/mysql/Install/MysqlInstallTaskDatabaseNameTest.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Database\Driver\mysql\Install\MysqlInstallTaskDatabaseNameTest
+ */
+
+namespace Drupal\Tests\Core\Database\Driver\mysql\Install {
+
+  use Drupal\Core\Database\Driver\mysql\Install\Tasks;
+  use Drupal\Tests\UnitTestCase;
+
+  /**
+   * Tests the MySQL install tasks.
+   *
+   * @coversDefaultClass \Drupal\Core\Database\Driver\mysql\Install\Tasks
+   * @group Database
+   */
+  class MysqlInstallTaskDatabaseNameTest extends UnitTestCase {
+
+    /**
+     * Database install tasks.
+     *
+     * @var \Drupal\Core\Database\Install\Tasks
+     */
+    protected $tasks;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setUp() {
+      $this->tasks = new Tasks();
+    }
+
+    /**
+     * @covers ::validateDatabaseSettings
+     * @dataProvider providerValidateDatabaseSettings
+     */
+    public function testValidateDatabaseSettings(array $database, array $expected_errors) {
+      $errors = $this->tasks->validateDatabaseSettings($database);
+      $this->assertSame($expected_errors, $errors);
+    }
+
+    /**
+     * Data provider for testValidateDatabaseSettings().
+     */
+    public function providerValidateDatabaseSettings() {
+      $return = array();
+
+      // Test valid database names.
+      foreach (array('valid', '123', '123.4.valid', '123_4_valid') as $valid) {
+        $database = array(
+          'database' => $valid,
+          'driver' => 'mysql',
+        );
+        $return[] = array($database, array());
+      }
+
+      // Test invalid database names.
+      foreach (array('/', '#', '#', '%', '-') as $invalid) {
+        $database = array(
+          'database' => $invalid,
+          'driver' => 'mysql',
+        );
+        $errors = array(
+          'mysql][database' => 'The database name you have entered, ' . $invalid . ', is invalid. The database name can only contain alphanumeric characters, underscores or dots.',
+        );
+        $return[] = array($database, $errors);
+      }
+
+      // Check valid prefixes.
+      foreach (array('valid', '123', '123.4.valid', '123_4_valid') as $valid) {
+        $database = array(
+          'database' => 'foo_bar',
+          'driver' => 'mysql',
+          'prefix' => $valid,
+        );
+        $return[] = array($database, array());
+      }
+
+      // Invalid prefixes.
+      foreach (array('/', '#', '#', '%') as $invalid) {
+        $database = array(
+          'database' => 'foo_bar',
+          'driver' => 'mysql',
+          'prefix' => $invalid,
+        );
+        $errors = array(
+          'mysql][prefix' => 'The database table prefix you have entered, ' . $invalid . ', is invalid. The table prefix can only contain alphanumeric characters, periods, or underscores.',
+        );
+        $return[] = array($database, $errors);
+      }
+
+      return $return;
+    }
+  }
+}
+
+namespace Drupal\Core\Database\Install {
+  if (!function_exists('t')) {
+    function t($string, array $args = []) {
+      return strtr($string, $args);
+    }
+  }
+}
diff --git a/core/tests/Drupal/Tests/Core/Database/Driver/mysql/MysqlConnectionTest.php b/core/tests/Drupal/Tests/Core/Database/Driver/mysql/MysqlConnectionTest.php
new file mode 100644
index 0000000..a63fa8d
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Database/Driver/mysql/MysqlConnectionTest.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Database\Driver\pgsql\MysqlConnectionTest.
+ */
+
+namespace Drupal\Tests\Core\Database\Driver\mysql;
+
+use Drupal\Core\Database\Driver\mysql\Connection;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Database\Driver\mysql\Connection
+ * @group Database
+ */
+class MysqlConnectionTest extends UnitTestCase {
+
+  /**
+   * Mock PDO object for use in tests.
+   *
+   * @var \PHPUnit_Framework_MockObject_MockObject|\Drupal\Tests\Core\Database\Stub\StubPDO
+   */
+  protected $mockPdo;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->mockPdo = $this->getMock('Drupal\Tests\Core\Database\Stub\StubPDO');
+  }
+
+  /**
+   * Data provider for testEscapeDatabaseName.
+   *
+   * @return array
+   *   An indexed array where each value is an array of arguments to pass to
+   *   testEscapeDatabaseName. The first value is the expected value,
+   *   and the second value is the value to test.
+   */
+  public function providerEscapeDatabaseNames() {
+    return [
+      ['`123`', '123'],
+      ['`foobar`', 'foo bar'],
+      ['`foobar`', 'foo(bar)'],
+      // For now dash is also be stripped out.
+      ['`foobar`', 'foo-bar'],
+      ['`foo_bar`', 'foo_bar'],
+      ['`foo.bar`', 'foo.bar'],
+      ['`FooBar`', 'FooBar'],
+    ];
+  }
+
+  /**
+   * @covers ::escapeDatabase
+   * @dataProvider providerEscapeDatabaseNames
+   */
+  public function testEscapeDatabaseName($expected, $name) {
+    $mysql_connection = new Connection($this->mockPdo, []);
+
+    $this->assertEquals($expected, $mysql_connection->escapeDatabase($name));
+  }
+
+}
