Emojis in Oxid – encoding in utf8mb4

Achtung dieser Artikel bezieht sich auf OXID bis zur Version 6. Ab OXID 6 ist diese Änderung bereits im Core als Feature enthalten.

Emojis sind mittlerweile nicht mehr aus der „gängigen“ Kommunikation wegzudenken. Es werden zum Teil gesamte Unterhaltungen nur mit Emojis geführt.

Immer wieder ist uns aufgefallen, dass gerade bei Produktbewertungen, gerne Emojis vom Kunden genutzt werden um Ihren Gefühlen Ausdruck zu verleihen.

Oxid kann diese im Standard aber nicht in der Datenbank speichern, da die Datenbank-Verbindung fest auf utf8 eingestellt ist, und die entsprechenden Tabellen-Spalten nicht entsprechend formatiert sind.

Mit einem kleinen „Hack“ und einer Anpassung am Tabellen-Layout ist dies aber ohne Probleme möglich.

Um den Zeichensatz einfach Ändern zu können, legen wir zu allererst eine neue Config-Variable in der Datei config.inc.php an.

$this->dbCharset = 'utf8mb4';

Im nächsten Schritt müssen die entsprechenden Zeilen in der Datei „core/oxdb.php“ geändert werden.

$charset = (string) self::_getConfigParam('dbCharset');
if ( null == $charset ) $charset = 'utf8';
if (self::_getConfigParam('_iUtfMode')) { $oDb->execute('SET NAMES "'.$charset.'"'); $oDb->execute('SET CHARACTER SET '.$charset.''); $oDb->execute('SET CHARACTER_SET_CONNECTION = '.$charset.''); $oDb->execute('SET CHARACTER_SET_DATABASE = '.$charset.''); $oDb->execute('SET character_set_results = '.$charset.''); $oDb->execute('SET character_set_server = '.$charset.'');
} elseif (($sConn = self::_getConfigParam('_sDefaultDatabaseConnection')) != '') { $oDb->execute('SET NAMES "' . $sConn . '"');
}

Jetzt ist zumindest bereits die Verbindung auf utf8mb4 umgestellt. Damit die Daten nun auch richtig gespeichert werden können müssen die benötigten Spalten umformatiert werden. Hier am Beispiel für den Bewertungstext einer Produktbewertung.

ALTER TABLE `oxreviews` CHANGE `OXTEXT` `OXTEXT` text COLLATE 'utf8mb4_general_ci' NOT NULL COMMENT 'Review text' AFTER `OXTYPE` COLLATE 'utf8mb4_general_ci';

Nun können alle Emojis gespeichert und wieder korrekt ausgelesen werden.

Warum ein genereller Wechsel auf utf8mb4 sinnvoll ist hat Adam Hooper bereits 2016 in einem Artikel veröffentlicht.

https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434



Start the discussion at OXID forums