diff --git a/adminer/dump.inc.php b/adminer/dump.inc.php index 67032522..7af973a5 100644 --- a/adminer/dump.inc.php +++ b/adminer/dump.inc.php @@ -16,7 +16,7 @@ if ($_POST && !$error) { if ($is_sql) { echo "-- Adminer $VERSION " . $drivers[DRIVER] . " dump\n\n"; if ($jush == "sql") { - echo "SET NAMES " . charset($connection) . "; + echo "SET NAMES utf8; SET time_zone = '+00:00'; " . ($_POST["data_style"] ? "SET foreign_key_checks = 0; SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; @@ -39,6 +39,7 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; $adminer->dumpDatabase($db); if ($connection->select_db($db)) { if ($is_sql && preg_match('~CREATE~', $style) && ($create = $connection->result("SHOW CREATE DATABASE " . idf_escape($db), 1))) { + set_utf8mb4($create); if ($style == "DROP+CREATE") { echo "DROP DATABASE IF EXISTS " . idf_escape($db) . ";\n"; } @@ -53,16 +54,18 @@ SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; if ($_POST["routines"]) { foreach (array("FUNCTION", "PROCEDURE") as $routine) { foreach (get_rows("SHOW $routine STATUS WHERE Db = " . q($db), null, "-- ") as $row) { - $out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") - . remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2)) . ";;\n\n"; + $create = remove_definer($connection->result("SHOW CREATE $routine " . idf_escape($row["Name"]), 2)); + set_utf8mb4($create); + $out .= ($style != 'DROP+CREATE' ? "DROP $routine IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n"; } } } if ($_POST["events"]) { foreach (get_rows("SHOW EVENTS", null, "-- ") as $row) { - $out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") - . remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3)) . ";;\n\n"; + $create = remove_definer($connection->result("SHOW CREATE EVENT " . idf_escape($row["Name"]), 3)); + set_utf8mb4($create); + $out .= ($style != 'DROP+CREATE' ? "DROP EVENT IF EXISTS " . idf_escape($row["Name"]) . ";;\n" : "") . "$create;;\n\n"; } } diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 4ef6ab44..f02455c5 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -637,7 +637,7 @@ username.form['auth[driver]'].onchange(); if ($style) { dump_csv(array_keys(fields($table))); } - } elseif ($style) { + } else { if ($is_view == 2) { $fields = array(); foreach (fields($table) as $name => $field) { @@ -647,7 +647,8 @@ username.form['auth[driver]'].onchange(); } else { $create = create_sql($table, $_POST["auto_increment"]); } - if ($create) { + set_utf8mb4($create); + if ($style && $create) { if ($style == "DROP+CREATE" || $is_view == 1) { echo "DROP " . ($is_view == 2 ? "VIEW" : "TABLE") . " IF EXISTS " . table($table) . ";\n"; } diff --git a/adminer/include/editing.inc.php b/adminer/include/editing.inc.php index dc5efabb..f5e27e39 100644 --- a/adminer/include/editing.inc.php +++ b/adminer/include/editing.inc.php @@ -523,3 +523,15 @@ function db_size($db) { } return format_number($return); } + +/** Print SET NAMES if utf8mb4 might be needed +* @param string +* @return null +*/ +function set_utf8mb4($create) { + static $set = false; + if (!$set && preg_match('~\butf8mb4~i', $create)) { // possible false positive + $set = true; + echo "SET NAMES utf8mb4;\n\n"; + } +} diff --git a/adminer/include/version.inc.php b/adminer/include/version.inc.php index e6fbc38c..ec06829a 100644 --- a/adminer/include/version.inc.php +++ b/adminer/include/version.inc.php @@ -1,2 +1,2 @@