diff --git a/core/includes/database/database.inc b/core/includes/database/database.inc
index 77584f9..6b89546 100644
--- a/core/includes/database/database.inc
+++ b/core/includes/database/database.inc
@@ -2123,6 +2123,13 @@ class DatabaseStatementBase extends PDOStatement implements DatabaseStatementInt
         $this->setFetchMode($options['fetch']);
       }
     }
+    // Allow individual queries to temporarily override the letter-casing of
+    // column names. Typically used by schema queries.
+    // This attribute is not supported on PDOStatement.
+    if (isset($options['case'])) {
+      $original_case = $this->dbh->getAttribute(PDO::ATTR_CASE);
+      $this->dbh->setAttribute(PDO::ATTR_CASE, $options['case']);
+    }
 
     $logger = $this->dbh->getLogger();
     if (!empty($logger)) {
@@ -2136,6 +2143,11 @@ class DatabaseStatementBase extends PDOStatement implements DatabaseStatementInt
       $logger->log($this, $args, $query_end - $query_start);
     }
 
+    // Revert letter-casing.
+    if (isset($options['case'])) {
+      $this->dbh->setAttribute(PDO::ATTR_CASE, $original_case);
+    }
+
     return $return;
   }
 
diff --git a/core/includes/database/mysql/database.inc b/core/includes/database/mysql/database.inc
index a57f7dd..a6d3832 100644
--- a/core/includes/database/mysql/database.inc
+++ b/core/includes/database/mysql/database.inc
@@ -46,8 +46,6 @@ class DatabaseConnection_mysql extends DatabaseConnection {
       PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
       // Because MySQL's prepared statements skip the query cache, because it's dumb.
       PDO::ATTR_EMULATE_PREPARES => TRUE,
-      // Force column names to lower case.
-      PDO::ATTR_CASE => PDO::CASE_LOWER,
     );
 
     parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']);
diff --git a/core/includes/database/mysql/schema.inc b/core/includes/database/mysql/schema.inc
index 4e88fa1..53be523 100644
--- a/core/includes/database/mysql/schema.inc
+++ b/core/includes/database/mysql/schema.inc
@@ -380,7 +380,12 @@ class DatabaseSchema_mysql extends DatabaseSchema {
   public function indexExists($table, $name) {
     // Returns one row for each column in the index. Result is string or FALSE.
     // Details at http://dev.mysql.com/doc/refman/5.0/en/show-index.html
-    $row = $this->connection->query('SHOW INDEX FROM {' . $table . "} WHERE key_name = '$name'")->fetchAssoc();
+    $row = $this->connection->query('SHOW INDEX FROM {' . $table . '} WHERE key_name = :name', array(
+      ':name' => $name,
+    ), array(
+      // Force column names to lower case.
+      'case' => PDO::CASE_LOWER
+    ))->fetchAssoc();
     return isset($row['key_name']);
   }
 
diff --git a/core/includes/database/pgsql/database.inc b/core/includes/database/pgsql/database.inc
index 68300e5..d3be256 100644
--- a/core/includes/database/pgsql/database.inc
+++ b/core/includes/database/pgsql/database.inc
@@ -62,8 +62,6 @@ class DatabaseConnection_pgsql extends DatabaseConnection {
       PDO::ATTR_EMULATE_PREPARES => TRUE,
       // Convert numeric values to strings when fetching.
       PDO::ATTR_STRINGIFY_FETCHES => TRUE,
-      // Force column names to lower case.
-      PDO::ATTR_CASE => PDO::CASE_LOWER,
     );
     parent::__construct($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']);
 
diff --git a/core/includes/database/sqlite/database.inc b/core/includes/database/sqlite/database.inc
index 98b35a2..a0312bd 100644
--- a/core/includes/database/sqlite/database.inc
+++ b/core/includes/database/sqlite/database.inc
@@ -68,8 +68,6 @@ class DatabaseConnection_sqlite extends DatabaseConnection {
       'pdo' => array(),
     );
     $connection_options['pdo'] += array(
-      // Force column names to lower case.
-      PDO::ATTR_CASE => PDO::CASE_LOWER,
       // Convert numeric values to strings when fetching.
       PDO::ATTR_STRINGIFY_FETCHES => TRUE,
     );
