From d36002d6b939069781f7fc48500d55438102c4a4 Mon Sep 17 00:00:00 2001 From: Marc Neudert Date: Wed, 11 Sep 2024 21:21:22 +0200 Subject: [PATCH] Add database collation to diagnostics --- .../Diagnostic/DatabaseAbilitiesCheck.php | 24 +++++++++++++++++++ .../Diagnostic/DatabaseInformational.php | 3 ++- plugins/Diagnostics/lang/en.json | 3 +++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php b/plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php index e764f1fe0634..6465633b278f 100644 --- a/plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php +++ b/plugins/Diagnostics/Diagnostic/DatabaseAbilitiesCheck.php @@ -42,6 +42,7 @@ public function execute() $result = new DiagnosticResult($this->translator->translate('Installation_DatabaseAbilities')); $result->addItem($this->checkUtf8mb4Charset()); + $result->addItem($this->checkCollation()); if (Config::getInstance()->General['enable_load_data_infile']) { $result->addItem($this->checkLoadDataInfile()); @@ -92,6 +93,29 @@ protected function checkUtf8mb4Charset() ); } + protected function checkCollation(): DiagnosticResultItem + { + $dbSettings = new Db\Settings(); + $collation = $dbSettings->getUsedCollation(); + + if ('' !== $collation) { + return new DiagnosticResultItem(DiagnosticResult::STATUS_OK, 'Connection collation'); + } + + $collationConnection = Db::get()->fetchOne('SELECT @@collation_connection'); + $collationCharset = DbHelper::getDefaultCollationForCharset($dbSettings->getUsedCharset()); + + return new DiagnosticResultItem( + DiagnosticResult::STATUS_WARNING, + sprintf( + 'Connection collation

%s

%s
%s
', + $this->translator->translate('Diagnostics_DatabaseCollationNotConfigured'), + $this->translator->translate('Diagnostics_DatabaseCollationConnection', [$collationConnection]), + $this->translator->translate('Diagnostics_DatabaseCollationCharset', [$collationCharset]) + ) + ); + } + protected function checkLoadDataInfile() { $optionTable = Common::prefixTable('option'); diff --git a/plugins/Diagnostics/Diagnostic/DatabaseInformational.php b/plugins/Diagnostics/Diagnostic/DatabaseInformational.php index 1d2dfc810325..1dd4eb6c522b 100644 --- a/plugins/Diagnostics/Diagnostic/DatabaseInformational.php +++ b/plugins/Diagnostics/Diagnostic/DatabaseInformational.php @@ -16,7 +16,7 @@ use Piwik\Translation\Translator; /** - * Informatation about the database. + * Information about the database. */ class DatabaseInformational implements Diagnostic { @@ -38,6 +38,7 @@ public function execute() $dbConfig = Config::getInstance()->database; $results[] = DiagnosticResult::informationalResult('DB Prefix', $dbConfig['tables_prefix']); $results[] = DiagnosticResult::informationalResult('DB Charset', $dbConfig['charset']); + $results[] = DiagnosticResult::informationalResult('DB Collation', $dbConfig['collation']); $results[] = DiagnosticResult::informationalResult('DB Adapter', $dbConfig['adapter']); $results[] = DiagnosticResult::informationalResult('MySQL Version', $this->getServerVersion()); $results[] = DiagnosticResult::informationalResult('Num Tables', $this->getNumMatomoTables()); diff --git a/plugins/Diagnostics/lang/en.json b/plugins/Diagnostics/lang/en.json index ee0a651ef8c9..fceb684afe61 100644 --- a/plugins/Diagnostics/lang/en.json +++ b/plugins/Diagnostics/lang/en.json @@ -12,6 +12,9 @@ "Sections": "Sections", "BrowserAndAutoArchivingEnabledLabel": "Browser and Auto-archiving enabled", "BrowserAndAutoArchivingEnabledComment": "It looks like both browser and auto archiving are enabled. Auto archiving last started %3$s ago. If %1$sauto archiving%2$s is enabled, you should disable browser archiving in \"General Settings\".", + "DatabaseCollationNotConfigured": "You database connection is configured without an explicit collation. Please update [database] collation = '' in the \"config/config.ini.php\" file with the collation to be used, to ensure all database features work as expected.", + "DatabaseCollationConnection": "Your currently used connection collation is: %1$s", + "DatabaseCollationCharset": "The default collation collation for your configured charset is: %1$s", "DatabaseReaderConnection": "Database Reader Connection", "DatabaseUtf8Requirement": "This is required to be able to store 4-byte UTF8 characters. Unless utf8mb4 is available special characters, such as emojis, less common characters of asian languages, various historic scripts or mathematical symbols will be replaced with %1$s. You can read more details about this topic in %2$sthis FAQ%3$s.", "DatabaseUtf8mb4CharsetRecommended": "Your database doesn't support utf8mb4 charset yet.",