Redmine und Emojis (Probleme mit UTF8 und Sonderzeichen)

(7 comments)

Ich hatte in meinen Redmine Installationen immer wieder Probleme, dass bestimmte e-Mails vom Mail System zwar angenommen wurden, aber beim Import in die Redmine Instanz ein 500er Fehler produziert wird.

Nach längerem Suchen hat sich herausgestellt, dass e-Mails, welche Emoji's oder andere Sonderzeichen aus den oberen Bereichen des UTF8 Zeichensatzes (japanische Zeichen, mathematische Zeichen,...) von Redmine beim Import nicht verarbeitet werden können.

Man kann sich diesen Effekt leicht anschauen, in dem man ein neues Ticket anlegt und in dem Tickettext ein Smiley aus dem UTF8 Zeichenvorrat einfügt. In diesem Fall wirft Redmine beim Speichern einen Fehler.

Nach intensiverer Recherche hat sich herausgestellt, dass nicht Redmine oder Rails das Problem sind, sondern die MySQL (oder bei mir die MariaDB) Datenbank. Leider sind derzeit die einzigen Reporter dieses Fehlers eher aus dem asiatischen Bereich und man braucht für die Recherche Google Translate ;-),...

Hier mal eine Kurzanleitung, was ich getan habe um das Problem zu fixen:


  • Datenbank sichern,....

  • InnoDB Einstellungen für MySQL/MariaDB ändern

  • Datei mit allen Tabellen erzeugen

  • InnoDB Indizes auf ROW_FORMAT=DYNAMIC ändern

  • Tabellen konvertieren

  • Datenbank konvertieren

  • fertig!

Hier mal die ganze Arbeit als Code Segment in der Shell:

#! /bin/sh
# Change database mode to long inno_db (don't know if it works,...)
cat < _EOF_
[Mysqld]
innodb_file_per_table = 1
innodb_file_format = barracuda
innodb_large_prefix = 1
_EOF_ > /etc/mysql/conf.d/utf8mb4.cnf

# restart mysql/mariadb
service mysql restart

# extract tables and construct mysql script
echo 'show tables;' | mysql -u root -p redmine | perl -ne 'chop; print "alter table $_ ROW_FORMAT=DYNAMIC;\nalter table $_ convert to character set utf8mb4 collate utf8mb4_unicode_ci;\n";' > /tmp/recode-redmine.sql

# strip the two first ones, because these are the headings!
ed $DEST.pem <<ED-Here-Session
1,2d
wq
ED-Here-Session
# change the database with:
mysql -u root -p redmine < /tmp/recode-redmine.sql
# change the complete database encoding:
echo 'ALTER DATABASE redmine CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' | mysql -u root -p

# in ..../redmine/config/database.yml change the following line:
# encoding: utf8 with encoding: utf8mb4

Wie immer gilt: Keine Gewähr & Es ist gut, wenn man versteht, was die Kommandos tun, sonst besser bleiben lassen!

Aktuell nicht bewertet

Kommentare

Thomas Koch 2 Jahre, 8 Monate her

Vielen Dank für die Ausarbeitung! Es hat mir echt geholfen gleich 2 Probleme zu lösen...

Leider lässt sich das default_row_format erst ab MySQL 5.7.8 global festlegen (und ist dann dort sogar schon auf DYNAMIC als Default).
Im Moment ist ein Konvertieren der DB eine etwas riskante Angelegenheit, da von redmines db:migrate das row_format als compact (Default) durchgeführt wird. Eventuell sind dadurch zukünftige Updates nicht so trivial zu integrieren.

Das Problem schlägt auch bei einer Neuinstallation zu. Ich hatte nämlich versucht ein Neues Redmine gleich mit utf8mb4 zu erstellen, doch schon das Initiale bundle exec rake db:migrate schlägt bei einigen Indexen fehl, wegen max key length:

Beispiel:
Mysql2::Error: Specified key was too long; max key length is 767 bytes: CREATE UNIQUE INDEX `changesets_repos_rev` ON `changesets` (`repository_id`, `revision`)

Link | Antwort
Aktuell nicht bewertet

Peter Pfläging 2 Jahre, 8 Monate her

Ich hatte das gleiche Problem. Ich bin zwar nicht der echte Guru in Rails, aber meinem Verständnis nach hat der Script: <code> /opt/redmine/config/initializers/enable_urf8mb4.rb</code> (ca in der Mitte des Artikels) genau das Problem gelöst.

Zumindest bei 2 Testinstanzen hat genau dieses Ruby Script das Problem gelöst. Das bedeutet man sollte dieses Script möglichst früh in der Redmine Installation anlegen, dann sind die 767byte Probleme weg!

Link | Antwort
Aktuell nicht bewertet

Thomas Koch 2 Jahre, 8 Monate her

Vielen Dank für die schnelle Antwort.
Leider kann ich die Referenz zum dem genannten Script (enable_urf8mb4.rb) nicht finden, aber das klingt vielversprechend. Auf welchen Artikel beziehen sie sich?

Link | Antwort
Aktuell nicht bewertet

Peter Pfläging 2 Jahre, 8 Monate her

Sorry, jetzt ist mir was ganz Peinliches passiert. Ich habe dan Artikel upgedated, aber leider nicht veröffentlicht. Jetzt ist die neue Version des Artikels draußen mit dem ganzen Ablauf und dem entsprechenden Script!

Link | Antwort
Aktuell nicht bewertet

Peter Pfläging 2 Jahre, 8 Monate her

Ok, noch mal daneben. bitte im Artikel: /blog/archives/1058 nachschauen, dort ist die komplette Anleitung,...

Link | Antwort
Aktuell nicht bewertet

Roland 1 Jahr, 7 Monate her

Vielen Dank für das Skript! Wir konnten so erfolgreich auf UTF8mb4 migrieren.

Link | Antwort
Aktuell nicht bewertet

Peter Pfläging 1 Jahr, 7 Monate her

Super, ich hoffe, das wandert so in den Redmine Core.

Link | Antwort
Aktuell nicht bewertet

Neuer Kommentar

benötigt

benötigt (nicht veröffentlicht)

optional

benötigt

Letzte Beiträge

Kategorien

Autoren

Archiv

2018
2017
2016
2015
2014
2013
2012
2011
2010
2009
2008
2007
2006
2005

Feeds

RSS / Atom