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!

Currently unrated

Comments

Thomas Koch 3 years, 4 months ago

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 | Reply
Currently unrated

Peter Pfläging 3 years, 4 months ago

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 | Reply
Currently unrated

Thomas Koch 3 years, 4 months ago

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 | Reply
Currently unrated

Peter Pfläging 3 years, 4 months ago

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 | Reply
Currently unrated

Peter Pfläging 3 years, 4 months ago

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

Link | Reply
Currently unrated

Roland 2 years, 3 months ago

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

Link | Reply
Currently unrated

Peter Pfläging 2 years, 3 months ago

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

Link | Reply
Currently unrated

New Comment

required

required (not published)

optional

required

Recent Posts

Categories

Authors

Archive

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

Feeds

RSS / Atom