diff --git a/administrator/components/com_admin/script.php b/administrator/components/com_admin/script.php
index 2762b5a6dbb36..b5b2fe708607d 100644
--- a/administrator/components/com_admin/script.php
+++ b/administrator/components/com_admin/script.php
@@ -33,10 +33,11 @@ public function update($installer)
$this->deleteUnexistingFiles();
$this->updateManifestCaches();
- $this->updateDatabase();
+ $this->uninstallEosPlugin();
$this->clearRadCache();
$this->updateAssets();
$this->clearStatsCache();
+ $this->updateUtf8Mb4();
}
/**
@@ -98,69 +99,6 @@ protected function clearStatsCache()
}
}
- /**
- * Method to update Database
- *
- * @return void
- */
- protected function updateDatabase()
- {
- $db = JFactory::getDbo();
-
- if (strpos($db->name, 'mysql') !== false)
- {
- $this->updateDatabaseMysql();
- }
-
- $this->uninstallEosPlugin();
- }
-
- /**
- * Method to update MySQL Database
- *
- * @return void
- */
- protected function updateDatabaseMysql()
- {
- $db = JFactory::getDbo();
-
- $db->setQuery('SHOW ENGINES');
-
- try
- {
- $results = $db->loadObjectList();
- }
- catch (Exception $e)
- {
- echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
';
-
- return;
- }
-
- foreach ($results as $result)
- {
- if ($result->Support != 'DEFAULT')
- {
- continue;
- }
-
- $db->setQuery('ALTER TABLE #__update_sites_extensions ENGINE = ' . $result->Engine);
-
- try
- {
- $db->execute();
- }
- catch (Exception $e)
- {
- echo JText::sprintf('JLIB_DATABASE_ERROR_FUNCTION_FAILED', $e->getCode(), $e->getMessage()) . '
';
-
- return;
- }
-
- break;
- }
- }
-
/**
* Uninstall the 2.5 EOS plugin
*
@@ -1569,4 +1507,113 @@ public function updateAssets()
return true;
}
+
+ /**
+ * Update the database with the correct UTF8MB4 settings.
+ *
+ * @return void.
+ *
+ * @since 3.5.0
+ */
+ private function updateUtf8Mb4()
+ {
+ $db = JFactory::getDbo();
+
+ $utf8mb4IsSupported = $this->serverClaimsUtf8mb4Support($db->name);
+
+ if ($utf8mb4IsSupported)
+ {
+ // Setup the adapter for the indexer.
+ $format = $db->name;
+
+ if ($format == 'mysqli' || $format == 'pdomysql')
+ {
+ $format = 'mysql';
+ }
+
+ if ($format == 'mysql')
+ {
+ $fileName = JPATH_ADMINISTRATOR . "/components/com_admin/sql/utf8mb4/" . $format . ".sql";
+
+ // Split the queries
+ $fileContents = @file_get_contents($fileName);
+ $queries = $db->splitSql($fileContents);
+
+ if (count($queries) == 0)
+ {
+ // No queries to process
+ return;
+ }
+
+ // Execute the queries
+ foreach ($queries as $query)
+ {
+ $query = trim($query);
+
+ if ($query != '' && $query{0} != '#')
+ {
+ try
+ {
+ $db->setQuery($query)->execute();
+ }
+ catch (RuntimeException $e)
+ {
+ JFactory::getApplication()->enqueueMessage(JText::sprintf('JLIB_DATABASE_QUERY_FAILED', $e->getCode(), $e->getMessage()));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Does the database server claim to have support for UTF-8 Multibyte (utf8mb4) collation?
+ *
+ * libmysql supports utf8mb4 since 5.5.3 (same version as the MySQL server). mysqlnd supports utf8mb4 since 5.0.9.
+ *
+ * @param string $format The type of database connection.
+ *
+ * @return boolean
+ *
+ * @since 3.5.0
+ */
+ private function serverClaimsUtf8mb4Support($format)
+ {
+ $db = JFactory::getDbo();
+
+ switch ($format)
+ {
+ case 'mysql':
+ $client_version = mysql_get_client_info();
+ $server_version = $db->getVersion();
+ break;
+ case 'mysqli':
+ $client_version = mysqli_get_client_info();
+ $server_version = $db->getVersion();
+ break;
+ case 'pdomysql':
+ $client_version = $db->getOption(PDO::ATTR_CLIENT_VERSION);
+ $server_version = $db->getOption(PDO::ATTR_SERVER_VERSION);
+ break;
+ default:
+ $client_version = false;
+ $server_version = false;
+ }
+
+ if ($client_version && version_compare($server_version, '5.5.3', '>='))
+ {
+ if (strpos($client_version, 'mysqlnd') !== false)
+ {
+ $client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);
+
+ return version_compare($client_version, '5.0.9', '>=');
+ }
+ else
+ {
+ return version_compare($client_version, '5.5.3', '>=');
+ }
+ }
+
+ return false;
+ }
}
diff --git a/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql b/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql
index 0522d1ee1cd64..dc6987ee027f8 100644
--- a/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql
+++ b/administrator/components/com_admin/sql/updates/mysql/3.5.0-2015-07-01.sql
@@ -1,89 +1,15 @@
--- WARNING: Do not rename this file with a different date. It MUST run before any other table updates when upgrading to Joomla! 3.5.0
-
-- Index and field changes to cater for UTF-8 Multibyte (utf8mb4)
ALTER TABLE `#__menu` DROP KEY `idx_client_id_parent_id_alias_language`, ADD UNIQUE KEY `idx_client_id_parent_id_alias_language` (`client_id`,`parent_id`,`alias`(191),`language`);
-
ALTER TABLE `#__redirect_links` DROP KEY `idx_link_old`, ADD UNIQUE KEY `idx_link_old` (`old_url`(191));
-
+ALTER TABLE `#__menu` DROP KEY `idx_path`, ADD KEY `idx_path` (`path`(191));
ALTER TABLE `#__session` MODIFY `session_id` varchar(191) NOT NULL DEFAULT '';
-
ALTER TABLE `#__user_keys` MODIFY `series` varchar(191) NOT NULL;
-
--- Convert all tables to UTF-8 Multibyte (utf8mb4)
-ALTER TABLE `#__assets` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__associations` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__banners` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__banner_clients` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__banner_tracks` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__categories` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__contact_details` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__content` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__content_frontpage` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__content_rating` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__content_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__contentitem_tag_map` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__core_log_searches` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__extensions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_filters` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms0` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms1` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms2` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms3` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms4` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms5` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms6` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms7` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms8` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_terms9` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_termsa` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_termsb` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_termsc` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_termsd` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_termse` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_links_termsf` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_taxonomy` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_taxonomy_map` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_terms` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_terms_common` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_tokens` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_tokens_aggregate` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__finder_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__languages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__menu` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__menu_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__messages_cfg` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__modules` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__modules_menu` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__newsfeeds` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__overrider` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__postinstall_messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__redirect_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__schemas` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__session` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__tags` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__template_styles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__ucm_base` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__ucm_content` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__ucm_history` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__updates` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__update_sites` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__update_sites_extensions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__usergroups` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__user_keys` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__user_notes` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__user_profiles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__user_usergroup_map` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-ALTER TABLE `#__viewlevels` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-
--- Convert utf8_bin collated columns to utf8mb4_bin collation
-ALTER TABLE `#__banners` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
-ALTER TABLE `#__categories` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
-ALTER TABLE `#__contact_details` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
-ALTER TABLE `#__content` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
-ALTER TABLE `#__menu` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'The SEF alias of the menu item.';
-ALTER TABLE `#__newsfeeds` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
-ALTER TABLE `#__tags` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
-ALTER TABLE `#__ucm_content` MODIFY `core_alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
\ No newline at end of file
+ALTER TABLE `#__update_sites_extensions` ENGINE=InnoDB;
+ALTER TABLE `#__banners` MODIFY `alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__categories` MODIFY `alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__contact_details` MODIFY `alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__content` MODIFY `alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__menu` MODIFY `alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The SEF alias of the menu item.';
+ALTER TABLE `#__newsfeeds` MODIFY `alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__tags` MODIFY `alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__ucm_content` MODIFY `core_alias` varchar(191) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '';
diff --git a/administrator/components/com_admin/sql/utf8mb4/mysql.sql b/administrator/components/com_admin/sql/utf8mb4/mysql.sql
new file mode 100644
index 0000000000000..b64b76c216ac1
--- /dev/null
+++ b/administrator/components/com_admin/sql/utf8mb4/mysql.sql
@@ -0,0 +1,144 @@
+-- WARNING: Do not rename this file with a different date. It MUST run before any other table updates when upgrading to Joomla! 3.5.0
+
+-- Convert all tables to UTF-8 Multibyte (utf8mb4)
+ALTER TABLE `#__assets` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__associations` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__banners` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__banner_clients` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__banner_tracks` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__categories` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__contact_details` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__content` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__content_frontpage` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__content_rating` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__content_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__contentitem_tag_map` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__core_log_searches` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__extensions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_filters` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms0` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms2` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms3` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms4` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms5` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms6` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms7` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms8` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_terms9` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_termsa` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_termsb` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_termsc` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_termsd` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_termse` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_links_termsf` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_taxonomy` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_taxonomy_map` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_terms` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_terms_common` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_tokens` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_tokens_aggregate` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__finder_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__languages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__menu` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__menu_types` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__messages_cfg` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__modules` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__modules_menu` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__newsfeeds` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__overrider` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__postinstall_messages` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__redirect_links` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__schemas` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__session` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__tags` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__template_styles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__ucm_base` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__ucm_content` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__ucm_history` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__updates` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__update_sites` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__update_sites_extensions` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__usergroups` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__users` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__user_keys` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__user_notes` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__user_profiles` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__user_usergroup_map` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+ALTER TABLE `#__viewlevels` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+
+-- Convert utf8_bin collated columns to utf8mb4_bin collation
+ALTER TABLE `#__banners` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__categories` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__contact_details` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__content` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__menu` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'The SEF alias of the menu item.';
+ALTER TABLE `#__newsfeeds` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__tags` MODIFY `alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
+ALTER TABLE `#__ucm_content` MODIFY `core_alias` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '';
+
+-- Convert columns back to their original size
+ALTER TABLE `#__banners` CHANGE COLUMN `description` `description` TEXT NOT NULL;
+ALTER TABLE `#__banners` CHANGE COLUMN `metakey` `metakey` TEXT NOT NULL;
+ALTER TABLE `#__banners` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__banner_clients` CHANGE COLUMN `extrainfo` `extrainfo` TEXT NOT NULL;
+ALTER TABLE `#__banner_clients` CHANGE COLUMN `metakey` `metakey` TEXT NOT NULL;
+ALTER TABLE `#__categories` CHANGE COLUMN `description` `description` MEDIUMTEXT NOT NULL;
+ALTER TABLE `#__categories` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__contact_details` CHANGE COLUMN `address` `address` TEXT NULL;
+ALTER TABLE `#__contact_details` CHANGE COLUMN `misc` `misc` MEDIUMTEXT NULL;
+ALTER TABLE `#__contact_details` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__contact_details` CHANGE COLUMN `metakey` `metakey` TEXT NOT NULL;
+ALTER TABLE `#__contact_details` CHANGE COLUMN `metadesc` `metadesc` TEXT NOT NULL;
+ALTER TABLE `#__contact_details` CHANGE COLUMN `metadata` `metadata` TEXT NOT NULL;
+ALTER TABLE `#__content` CHANGE COLUMN `introtext` `introtext` MEDIUMTEXT NOT NULL;
+ALTER TABLE `#__content` CHANGE COLUMN `fulltext` `fulltext` MEDIUMTEXT NOT NULL;
+ALTER TABLE `#__content` CHANGE COLUMN `images` `images` TEXT NOT NULL;
+ALTER TABLE `#__content` CHANGE COLUMN `urls` `urls` TEXT NOT NULL;
+ALTER TABLE `#__content` CHANGE COLUMN `metakey` `metakey` TEXT NOT NULL;
+ALTER TABLE `#__content` CHANGE COLUMN `metadesc` `metadesc` TEXT NOT NULL;
+ALTER TABLE `#__content` CHANGE COLUMN `metadata` `metadata` TEXT NOT NULL;
+ALTER TABLE `#__content_types` CHANGE COLUMN `rules` `rules` TEXT NOT NULL;
+ALTER TABLE `#__content_types` CHANGE COLUMN `field_mappings` `field_mappings` TEXT NOT NULL;
+ALTER TABLE `#__extensions` CHANGE COLUMN `manifest_cache` `manifest_cache` TEXT NOT NULL;
+ALTER TABLE `#__extensions` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__extensions` CHANGE COLUMN `custom_data` `custom_data` TEXT NOT NULL;
+ALTER TABLE `#__extensions` CHANGE COLUMN `system_data` `system_data` TEXT NOT NULL;
+ALTER TABLE `#__finder_filters` CHANGE COLUMN `data` `data` TEXT NOT NULL;
+ALTER TABLE `#__finder_filters` CHANGE COLUMN `params` `params` MEDIUMTEXT;
+ALTER TABLE `#__languages` CHANGE COLUMN `metakey` `metakey` TEXT NOT NULL;
+ALTER TABLE `#__languages` CHANGE COLUMN `metadesc` `metadesc` TEXT NOT NULL;
+ALTER TABLE `#__menu` CHANGE COLUMN `params` `params` TEXT NOT NULL COMMENT 'JSON encoded data for the menu item.';
+ALTER TABLE `#__messages` CHANGE COLUMN `message` `message` TEXT NOT NULL;
+ALTER TABLE `#__modules` CHANGE COLUMN `content` `content` TEXT NOT NULL;
+ALTER TABLE `#__modules` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__newsfeeds` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__newsfeeds` CHANGE COLUMN `metakey` `metakey` TEXT NOT NULL;
+ALTER TABLE `#__newsfeeds` CHANGE COLUMN `metadesc` `metadesc` TEXT NOT NULL;
+ALTER TABLE `#__newsfeeds` CHANGE COLUMN `metadata` `metadata` TEXT NOT NULL;
+ALTER TABLE `#__newsfeeds` CHANGE COLUMN `description` `description` TEXT NOT NULL;
+ALTER TABLE `#__newsfeeds` CHANGE COLUMN `images` `images` TEXT NOT NULL;
+ALTER TABLE `#__overrider` CHANGE COLUMN `string` `string` TEXT NOT NULL;
+ALTER TABLE `#__session` CHANGE COLUMN `data` `data` MEDIUMTEXT;
+ALTER TABLE `#__tags` CHANGE COLUMN `description` `description` MEDIUMTEXT NOT NULL;
+ALTER TABLE `#__tags` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__tags` CHANGE COLUMN `images` `images` TEXT NOT NULL;
+ALTER TABLE `#__tags` CHANGE COLUMN `urls` `urls` TEXT NOT NULL;
+ALTER TABLE `#__template_styles` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__ucm_content` CHANGE COLUMN `core_body` `core_body` MEDIUMTEXT NOT NULL;
+ALTER TABLE `#__ucm_content` CHANGE COLUMN `core_params` `core_params` TEXT NOT NULL;
+ALTER TABLE `#__ucm_content` CHANGE COLUMN `core_images` `core_images` TEXT NOT NULL;
+ALTER TABLE `#__ucm_content` CHANGE COLUMN `core_urls` `core_urls` TEXT NOT NULL;
+ALTER TABLE `#__ucm_content` CHANGE COLUMN `core_metakey` `core_metakey` TEXT NOT NULL;
+ALTER TABLE `#__ucm_content` CHANGE COLUMN `core_metadesc` `core_metadesc` TEXT NOT NULL;
+ALTER TABLE `#__ucm_history` CHANGE COLUMN `version_data` `version_data` MEDIUMTEXT NOT NULL COMMENT 'json-encoded string of version data';
+ALTER TABLE `#__updates` CHANGE COLUMN `description` `description` TEXT NOT NULL;
+ALTER TABLE `#__updates` CHANGE COLUMN `data` `data` TEXT NOT NULL;
+ALTER TABLE `#__updates` CHANGE COLUMN `detailsurl` `detailsurl` TEXT NOT NULL;
+ALTER TABLE `#__updates` CHANGE COLUMN `infourl` `infourl` TEXT NOT NULL;
+ALTER TABLE `#__update_sites` CHANGE COLUMN `location` `location` TEXT NOT NULL;
+ALTER TABLE `#__users` CHANGE COLUMN `params` `params` TEXT NOT NULL;
+ALTER TABLE `#__user_notes` CHANGE COLUMN `body` `body` TEXT NOT NULL;
+ALTER TABLE `#__user_profiles` CHANGE COLUMN `profile_value` `profile_value` TEXT NOT NULL;
diff --git a/administrator/components/com_installer/models/database.php b/administrator/components/com_installer/models/database.php
index 240585779bb28..2137aba8b9860 100644
--- a/administrator/components/com_installer/models/database.php
+++ b/administrator/components/com_installer/models/database.php
@@ -270,7 +270,7 @@ public function convertTablesToUtf8mb4()
// Get the SQL file to convert the core tables. Yes, this is hardcoded because we have all sorts of index
// conversions and funky things we can't automate in core tables without an actual SQL file.
$serverType = $db->getServerType();
- $fileName = JPATH_ADMINISTRATOR . "/components/com_admin/sql/updates/$serverType/3.5.0-2015-07-01.sql";
+ $fileName = JPATH_ADMINISTRATOR . "/components/com_admin/sql/utf8mb4/" . $serverType . ".sql";
if (!is_file($fileName))
{
@@ -287,13 +287,18 @@ public function convertTablesToUtf8mb4()
foreach ($queries as $query)
{
- try
- {
- $db->setQuery($query)->execute();
- }
- catch (Exception $e)
+ $query = trim($query);
+
+ if ($query != '' && $query{0} != '#')
{
- // If the query fails we will go on. It probably means we've already done this conversion.
+ try
+ {
+ $db->setQuery($query)->execute();
+ }
+ catch (RuntimeException $e)
+ {
+ JFactory::getApplication()->enqueueMessage(JText::sprintf('JLIB_DATABASE_QUERY_FAILED', $e->getCode(), $e->getMessage()));
+ }
}
}
}
diff --git a/libraries/joomla/database/driver/mysql.php b/libraries/joomla/database/driver/mysql.php
index 95dfe322a4a95..569a0866ee1e3 100644
--- a/libraries/joomla/database/driver/mysql.php
+++ b/libraries/joomla/database/driver/mysql.php
@@ -510,16 +510,24 @@ private function hasProfiling()
private function serverClaimsUtf8mb4Support()
{
$client_version = mysql_get_client_info();
+ $server_version = $this->getVersion();
- if (strpos($client_version, 'mysqlnd') !== false)
+ if (version_compare($server_version, '5.5.3', '<'))
{
- $client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);
-
- return version_compare($client_version, '5.0.9', '>=');
+ return false;
}
else
{
- return version_compare($client_version, '5.5.3', '>=');
+ if (strpos($client_version, 'mysqlnd') !== false)
+ {
+ $client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);
+
+ return version_compare($client_version, '5.0.9', '>=');
+ }
+ else
+ {
+ return version_compare($client_version, '5.5.3', '>=');
+ }
}
}
diff --git a/libraries/joomla/database/driver/mysqli.php b/libraries/joomla/database/driver/mysqli.php
index 22d3a6ace0acf..a0a10b4353b57 100644
--- a/libraries/joomla/database/driver/mysqli.php
+++ b/libraries/joomla/database/driver/mysqli.php
@@ -952,16 +952,24 @@ private function hasProfiling()
private function serverClaimsUtf8mb4Support()
{
$client_version = mysqli_get_client_info();
+ $server_version = $this->getVersion();
- if (strpos($client_version, 'mysqlnd') !== false)
+ if (version_compare($server_version, '5.5.3', '<'))
{
- $client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);
-
- return version_compare($client_version, '5.0.9', '>=');
+ return false;
}
else
{
- return version_compare($client_version, '5.5.3', '>=');
+ if (strpos($client_version, 'mysqlnd') !== false)
+ {
+ $client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version);
+
+ return version_compare($client_version, '5.0.9', '>=');
+ }
+ else
+ {
+ return version_compare($client_version, '5.5.3', '>=');
+ }
}
}
diff --git a/libraries/joomla/database/driver/pdo.php b/libraries/joomla/database/driver/pdo.php
index 8ae77c713b17f..e26bab4d43457 100644
--- a/libraries/joomla/database/driver/pdo.php
+++ b/libraries/joomla/database/driver/pdo.php
@@ -325,7 +325,7 @@ public function disconnect()
}
$this->freeResult();
- unset($this->connection);
+ $this->connection = null;
}
/**
diff --git a/libraries/joomla/database/driver/pdomysql.php b/libraries/joomla/database/driver/pdomysql.php
index 01269cbe57177..10c40469c8874 100644
--- a/libraries/joomla/database/driver/pdomysql.php
+++ b/libraries/joomla/database/driver/pdomysql.php
@@ -72,24 +72,21 @@ class JDatabaseDriverPdomysql extends JDatabaseDriverPdo
*/
public function __construct($options)
{
- /**
- * Pre-populate the UTF-8 Multibyte compatibility flag. Unfortuantely PDO won't report the server version
- * unless we're connected to it and we cannot connect to it unless we know if it supports utf8mb4 which requires
- * us knowing the server version. Between this chicken and egg issue we _assume_ it's supported and we'll just
- * catch any problems at connection time.
- */
- $this->utf8mb4 = true;
-
// Get some basic values from the options.
$options['driver'] = 'mysql';
- $options['charset'] = (isset($options['charset'])) ? $options['charset'] : 'utf8';
- if ($this->utf8mb4 && ($options['charset'] == 'utf8'))
+ if (!isset($options['charset']) || $options['charset'] == 'utf8')
{
$options['charset'] = 'utf8mb4';
}
- $this->charset = $options['charset'];
+ /**
+ * Pre-populate the UTF-8 Multibyte compatibility flag. Unfortunately PDO won't report the server version
+ * unless we're connected to it, and we cannot connect to it unless we know if it supports utf8mb4, which requires
+ * us knowing the server version. Because of this chicken and egg issue, we _assume_ it's supported and we'll just
+ * catch any problems at connection time.
+ */
+ $this->utf8mb4 = ($options['charset'] == 'utf8mb4');
// Finalize initialisation.
parent::__construct($options);
@@ -112,27 +109,44 @@ public function connect()
}
catch (\RuntimeException $e)
{
- // If the connection failed but not because of the wrong character set bubble up the exception
- if (!$this->utf8mb4 || ($this->options['charset'] != 'utf8mb4'))
+ // If the connection failed, but not because of the wrong character set, then bubble up the exception.
+ if (!$this->utf8mb4)
{
throw $e;
}
- /**
- * If the connection failed and I was trying to use the utf8mb4 charset then it is likely that the server
- * doesn't support utf8mb4 despite claiming otherwise.
- *
- * This happens on old MySQL server versions (less than 5.5.3) using the mysqlnd PHP driver. Since mysqlnd
- * masks the server version and reports only its own we can not be sure if the server actually does support
- * UTF-8 Multibyte (i.e. it's MySQL 5.5.3 or later). Since the utf8mb4 charset is undefined in this case we
- * catch the error and determine that utf8mb4 is not supported!
+ /*
+ * Otherwise, try connecting again without using
+ * utf8mb4 and see if maybe that was the problem. If the
+ * connection succeeds, then we will have learned that the
+ * client end of the connection does not support utf8mb4.
*/
+
$this->utf8mb4 = false;
$this->options['charset'] = 'utf8';
parent::connect();
}
+ if ($this->utf8mb4)
+ {
+ /*
+ * At this point we know the client supports utf8mb4. Now
+ * we must check if the server supports utf8mb4 as well.
+ */
+
+ $serverVersion = $this->connection->getAttribute(PDO::ATTR_SERVER_VERSION);
+ $this->utf8mb4 = version_compare($serverVersion, '5.5.3', '>=');
+
+ if (!$this->utf8mb4)
+ {
+ // Reconnect with the utf8 character set.
+ parent::disconnect();
+ $this->options['charset'] = 'utf8';
+ parent::connect();
+ }
+ }
+
$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
}