From b04469a252c8b31e17dd5099598ed47b61b97ad7 Mon Sep 17 00:00:00 2001 From: Alexei Sorokin Date: Sat, 12 Sep 2020 15:40:39 +0300 Subject: [PATCH] [DATABASE] Make sure the session always uses UTF-8 and UTC --- classes/Memcached_DataObject.php | 5 ++++- lib/util/installer.php | 15 ++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index 76e09fee72..6ab3838070 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -894,11 +894,14 @@ class Memcached_DataObject extends Safe_DataObject $result = parent::_connect(); if ($result && !$exists) { - // Needed to make timestamp values usefully comparable. + // Required to make timestamp values usefully comparable. + // And set the character set to UTF-8. if (common_config('db', 'type') !== 'mysql') { parent::_query("SET TIME ZONE INTERVAL '+00:00' HOUR TO MINUTE"); + parent::_query("SET NAMES 'UTF8'"); } else { parent::_query("SET time_zone = '+0:00'"); + parent::_query("SET NAMES 'utf8mb4'"); } } diff --git a/lib/util/installer.php b/lib/util/installer.php index 01afa46d2b..1d3b5602af 100644 --- a/lib/util/installer.php +++ b/lib/util/installer.php @@ -306,6 +306,8 @@ abstract class Installer switch ($this->dbtype) { case 'pgsql': + // ensure the timezone is UTC + $conn->query("SET TIME ZONE INTERVAL '+00:00' HOUR TO MINUTE"); // ensure the database encoding is UTF8 $conn->query("SET NAMES 'UTF8'"); $server_encoding = $conn->getRow('SHOW server_encoding')[0]; @@ -313,11 +315,13 @@ abstract class Installer $this->updateStatus( 'GNU social requires the UTF8 character encoding. Yours is ' . htmlentities($server_encoding) - ); + ); return false; } break; case 'mysql': + // ensure the timezone is UTC + $conn->query("SET time_zone = '+0:00'"); // ensure the database encoding is utf8mb4 $conn->query("SET NAMES 'utf8mb4'"); $server_encoding = $conn->getRow("SHOW VARIABLES LIKE 'character_set_server'")[1]; @@ -340,10 +344,11 @@ abstract class Installer return false; } - foreach (['sms_carrier' => 'SMS carrier', - 'notice_source' => 'notice source', - 'foreign_services' => 'foreign service'] - as $scr => $name) { + foreach ([ + 'sms_carrier' => 'SMS carrier', + 'notice_source' => 'notice source', + 'foreign_services' => 'foreign service', + ] as $scr => $name) { $this->updateStatus(sprintf("Adding %s data to database...", $name)); $res = $this->runDbScript($scr . '.sql', $conn); if ($res === false) {