Index: database_mysql_dump.inc
===================================================================
--- database_mysql_dump.inc	(revision 61)
+++ database_mysql_dump.inc	(working copy)
@@ -22,16 +22,33 @@ function demo_dump_db($filename, $option
   }
 
   if ($fp = fopen($filename, 'wb')) {
-    $header = "-- Demo.module database dump (version " . DEMO_DUMP_VERSION . ")\n";
-    $header .= "-- http://drupal.org/project/demo\n";
-    $header .= "--\n";
-    $header .= "-- Database: " . _demo_get_database() . "\n";
-    $header .= "-- Date: " . format_date(time(), 'large') . "\n\n";
+    $header = array();
+    $header[] = '-- Demo module database dump';
+    $header[] = '-- Version ' . DEMO_DUMP_VERSION;
+    $header[] = '-- http://drupal.org/project/demo';
+    $header[] = '--';
+    $header[] = '-- Database: ' . _demo_get_database();
+    $header[] = '-- Date: ' . format_date(time(), 'small');
+    $header[] = '-- Server version: ' . db_version();
+    $header[] = '-- PHP version: ' . PHP_VERSION;
+    $header[] = '-- Drupal version: ' . VERSION;
+
     // Avoid auto value for zero values (required for user id 0).
-    $header .= "SET SQL_MODE=\"NO_AUTO_VALUE_ON_ZERO\";\n";
+    $header[] = '';
+    $header[] = 'SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";';
     // Temporarily disable foreign key checks for the time of import.
-    $header .= "SET FOREIGN_KEY_CHECKS = 0;\n";
-    fwrite($fp, $header);
+    $header[] = 'SET FOREIGN_KEY_CHECKS = 0;';
+    $header[] = '';
+
+    // Set collations for the import. PMA and mysqldump use conditional comments
+    // to exclude MySQL <4.1, but D6 requires >=4.1.
+    $header[] = 'SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;';
+    $header[] = 'SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;';
+    $header[] = 'SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;';
+    $header[] = 'SET NAMES utf8;';
+    $header[] = '';
+
+    fwrite($fp, implode("\n", $header));
 
     foreach ($options['tables'] as $table => $dump_options) {
       if (!_demo_table_is_view($table)) {
@@ -44,8 +61,19 @@ function demo_dump_db($filename, $option
       }
     }
 
+    $footer = array();
+    $footer[] = '';
     // Re-enable foreign key checks.
-    fwrite($fp, "\nSET FOREIGN_KEY_CHECKS = 1;\n");
+    $footer[] = 'SET FOREIGN_KEY_CHECKS = 1;';
+
+    // Revert collations.
+    $footer[] = 'SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT;';
+    $footer[] = 'SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS;';
+    $footer[] = 'SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION;';
+    $footer[] = '';
+
+    $footer[] = '';
+    fwrite($fp, implode("\n", $footer));
 
     fclose($fp);
     return TRUE;
@@ -85,23 +113,50 @@ function _demo_dump_table_schema($fp, $t
   $output .= "--\n\n";
 
   $data = db_fetch_array(db_query("SHOW CREATE TABLE %s", $table));
-  $output .= preg_replace('/^CREATE TABLE/', 'CREATE TABLE IF NOT EXISTS', $data['Create Table']);
   $status = db_fetch_array(db_query("SHOW TABLE STATUS LIKE '%s'", $table));
-  // PDO is missing the table type.
+
+  // Add 'IF NOT EXISTS'.
+  $output .= preg_replace('/^CREATE TABLE/', 'CREATE TABLE IF NOT EXISTS', $data['Create Table']);
+
+  // Column keys in $status start with a lower-case letter in PDO and with a
+  // upper-case letter otherwise. We convert all to lower-case.
+  foreach ($status as $key => $value) {
+    $key_lower = strtolower($key);
+    if ($key[0] != $key_lower[0]) {
+      $status[$key_lower] = $value;
+      unset($status[$key]);
+    }
+  }
+
+  // SHOW CREATE TABLE does not contain collation information, if the collation
+  // is equal to the default collation of the connection. Since dumps can be
+  // moved across servers, we need to ensure correct collations.
+  // Note that [DEFAULT] CHARSET or [DEFAULT] CHARACTER SET is always contained,
+  // even if it is equal to the default.
+  // This addition assumes that a collation specified for a table is taken over
+  // for the table's columns. The MySQL manual does not state whether this is
+  // the case, but manual tests confirmed that it works that way.
+  if (!strpos($output, 'COLLATE=')) {
+    // Only if the collation contains a underscore, the first string up to the
+    // first underscore is the character set.
+    // @see PMA_exportDBCreate()
+    if (strpos($status['collation'], '_')) {
+      // @todo May need preg_replace() to inject after CHARSET|CHARACTER SET.
+      $output .= ' COLLATE=' . $status['collation'];
+    }
+  }
+
+  // PDO is missing the table engine.
   if (!strpos($output, ' ENGINE=')) {
     $output .= ' ENGINE=' . $status['engine'];
   }
-  // @todo Wrong value; contains 'utf8_general_ci' (collation), not 'utf8' (charset).
-  //$output .= ' DEFAULT CHARSET=' . $status['collation'];
-  if (!empty($status['comment'])) {
+
+  // Add a table comment, if there is one.
+  if (!strpos($output, ' COMMENT') && !empty($status['comment'])) {
     $output .= " COMMENT='" . $status['comment'] . "'";
   }
-  // @todo Depends on whether we dump data and table existence on import.
-//  if (!empty($status['auto_increment'])) {
-//    $output .= ' AUTO_INCREMENT=' . $status['auto_increment'];
-//  }
-  $output .= ";\n";
 
+  $output .= ";\n";
   fwrite($fp, $output);
 }
 
