diff --git a/typo3/sysext/reports/Classes/Report/Status/ConfigurationStatus.php b/typo3/sysext/reports/Classes/Report/Status/ConfigurationStatus.php index 1cd256a59a3b3853c4e8ca3dfebddbc805801f13..74c688be39f471e735841fa5e544ad5c2b35a8e9 100644 --- a/typo3/sysext/reports/Classes/Report/Status/ConfigurationStatus.php +++ b/typo3/sysext/reports/Classes/Report/Status/ConfigurationStatus.php @@ -16,6 +16,7 @@ namespace TYPO3\CMS\Reports\Report\Status; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Database\ConnectionPool; +use TYPO3\CMS\Core\Database\Query\QueryBuilder; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Messaging\FlashMessageService; use TYPO3\CMS\Core\Registry; @@ -288,6 +289,7 @@ class ConfigurationStatus implements StatusProviderInterface { $connection = GeneralUtility::makeInstance(ConnectionPool::class) ->getConnectionByName(ConnectionPool::DEFAULT_CONNECTION_NAME); + /** @var QueryBuilder $queryBuilder */ $queryBuilder = $connection->createQueryBuilder(); $defaultDatabaseCharset = (string)$queryBuilder->select('DEFAULT_CHARACTER_SET_NAME') ->from('information_schema.SCHEMATA') @@ -302,10 +304,29 @@ class ConfigurationStatus implements StatusProviderInterface $statusValue = $this->getLanguageService()->getLL('status_ok'); // also allow utf8mb4 if (!StringUtility::beginsWith($defaultDatabaseCharset, 'utf8')) { - $message = sprintf($this->getLanguageService() - ->getLL('status_MysqlDatabaseCharacterSet_Unsupported'), $defaultDatabaseCharset); - $severity = ReportStatus::ERROR; - $statusValue = $this->getLanguageService()->getLL('status_wrongValue'); + // If the default character set is e.g. latin1, BUT all tables in the system are UTF-8, + // we assume that TYPO3 has the correct charset for adding tables, and everything is fine + $nonUtf8TableCollationsFound = $queryBuilder->select('table_collation') + ->from('information_schema.tables') + ->where( + $queryBuilder->expr()->andX( + $queryBuilder->expr()->eq('table_schema', $queryBuilder->quote($connection->getDatabase())), + $queryBuilder->expr()->notLike('table_collation', $queryBuilder->quote('utf8%')) + ) + ) + ->setMaxResults(1) + ->execute(); + + if ($nonUtf8TableCollationsFound->rowCount() > 0) { + $message = sprintf($this->getLanguageService() + ->getLL('status_MysqlDatabaseCharacterSet_Unsupported'), $defaultDatabaseCharset); + $severity = ReportStatus::ERROR; + $statusValue = $this->getLanguageService()->getLL('status_wrongValue'); + } else { + $message = $this->getLanguageService()->getLL('status_MysqlDatabaseCharacterSet_Info'); + $severity = ReportStatus::INFO; + $statusValue = $this->getLanguageService()->getLL('status_info'); + } } else { $message = $this->getLanguageService()->getLL('status_MysqlDatabaseCharacterSet_Ok'); } diff --git a/typo3/sysext/reports/Resources/Private/Language/locallang_reports.xlf b/typo3/sysext/reports/Resources/Private/Language/locallang_reports.xlf index 4a5f656a31fd006b5756194ac8701e801ef69746..a1fc98495a1952b111aa3d3753c84d5d385db2e8 100644 --- a/typo3/sysext/reports/Resources/Private/Language/locallang_reports.xlf +++ b/typo3/sysext/reports/Resources/Private/Language/locallang_reports.xlf @@ -18,6 +18,9 @@ <trans-unit id="status_wrongValue"> <source>Wrong value detected</source> </trans-unit> + <trans-unit id="status_info"> + <source>Information</source> + </trans-unit> <trans-unit id="status_insecure"> <source>Insecure</source> </trans-unit> @@ -114,6 +117,9 @@ <trans-unit id="status_MysqlDatabaseCharacterSet_Ok"> <source>Your default database uses utf-8. All good.</source> </trans-unit> + <trans-unit id="status_MysqlDatabaseCharacterSet_Info"> + <source>Your default database uses a different charset, but all tables uses utf-8. All good. But consider fixing your database collation and check the table creation settings.</source> + </trans-unit> <trans-unit id="status_trustedHostsPattern"> <source>Trusted Hosts Pattern</source> </trans-unit>