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); }