Ergebnis 1 bis 12 von 12

Thema: Einzelne Tabellenkollation ändern / eine Tabelle als UTF8-MB4 anlegen

  1. #1
    Contao-Nutzer
    Registriert seit
    11.09.2016.
    Beiträge
    79

    Standard Einzelne Tabellenkollation ändern / eine Tabelle als UTF8-MB4 anlegen

    Hallo zusammen, nächste Quizfrage aus meiner Ecke: Ist es bei Contao (3.5) möglich bei vereinzelten Tabellen ein anderes Schema einzustellen, als bei den anderen?
    In meinem Fall habe ich die Datenbank so installiert, wie es bei Contao voreingestellt war (Datenbank: utf8_general_ci / InnoDB, Tabellen: utf8_general_ci / MyISAM). Nun habe ich die Anforderung in einer Tabelle Sonderzeichen wie z.B. Emojis zu speichern. Da hierfür 4 Bytes pro Zeichen benötigt werden, soll die Tabelle die Kollation utf8mb4_unicode_ci bekommen.

    Mein Vorgehen (naiv wie ich manchmal bin) sah so aus, dass ich einfach die gesamte Datenbank auf diese Kollation umstellen wollte. Hier gab es aber diverse Probleme. Der Datenbank-Updater und das Install-Tool meckerten sofort rum, dass sämtliche Tabellen aktualisiert werden und auch einige Indizes gelöscht werden müssten. Ein manuelles Umwandeln der Tabellen brachte auch nur bedingte Erfolge. Dazu kommt, dass ich noch weitere Plugins nutze, die mit dem Schema ebenfalls Probleme zu haben scheinen.

    Daher die Frage: Gibt es die Möglichkeit im DCA oder so anzugeben, dass nur Tabelle X eine andere Kollation erhalten soll und die übrigen unangetastet bleiben? Ich habe die eine Tabelle schon mal im phpmyadmin auf besagte Kollation umgestellt. Interessanter Weise beschwert sich der Datenbank-Updater auch nicht. Jedoch scheinen meine Emojis dennoch nicht korrekt in der Tabelle gespeichert zu werden. Ich vermute, weil Contao nach wie vor in den normalen utf8 Zeichensatz konvertiert oder so.

    Hat jemand eine Idee wie ich diesen Sonderfall lösen kann bzw. diese eine Tabelle gesondert behandeln kann?

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Du musst das dbCharset auf jeden Fall auf utf8mb4 stellen, da ansonsten die falsche Einstellung für die MySQL Verbindung benutzt wird.

  3. #3
    Contao-Nutzer
    Registriert seit
    11.09.2016.
    Beiträge
    79

    Standard

    Hm, okay. Also ganz oder gar nicht.
    Dann werde ich mir wohl etwas anderes überlegen müssen. Oder ich setze mich in einer sehr ruhigen Minute nochmal ran und versuche das Ganze fehlerfrei über die Bühne zu bekommen.
    Scheint aber nicht ganz trivial zu sein.

    Dankeschön.

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Zitat Zitat von *igi* Beitrag anzeigen
    Hm, okay. Also ganz oder gar nicht.
    Nein, so habe ich das nicht gemeint. Ich würde zuerst mal einfach nur
    PHP-Code:
    $GLOBALS['TL_CONFIG']['dbCharset'] = 'UTF8MB4'
    setzen und die betroffene Tabelle ändern. Bei manchen Tabellen (wie zB tl_files) musst du dann manuell noch Anpassungen im DCA einfügen. Wie zB bei tl_files folgendes:
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_files']['config']['sql']['keys']['path'] = 'index(191)'
    (maximal 250). Siehe zB https://github.com/contao/core/issues/8484

  5. #5
    Contao-Nutzer
    Registriert seit
    11.09.2016.
    Beiträge
    79

    Standard

    Also meine Ergebnisse sehen im Moment so aus:
    (Testszenario: Ein Emoji von https://emojipedia.org/grinning-face-with-smiling-eyes/ auswählen und über ein Text-Input in der Datenbank speichern (Feld: "msg" -> Varchar (255))

    - Wenn Contao im Originalzustand ist, wird einfach ein leerer Eintrag in der Tabelle angelegt. Das Feld "msg" in Tabelle ist leer.
    - Wenn ich die Kollation dieser einen Tabelle im phpmyadmin manuell auf utf8mb4_unicode_ci umstelle und den Test wiederhole, kommt das gleiche Ergebnis dabei raus -> leerer Tabelleneintrag.
    - Wenn ich zusätzlich das "dbCharset" auf "UTF8MB4" stelle (localconfig.php) und den Test wiederhole wird ein Fragezeichen ("?") statt des Emoji in der Tabelle gespeichert.
    - Wenn ich nun noch den Wert "dbCollation" auf "utf8_unicode_ci" stelle und den Test wiederhole, geschehen zwei Dinge: a) das Emoji wird korrekt in der Tabelle gespeichert und b) das Installtool markiert mir nahezu alle Tabellen als "nicht aktuell". Auffällig hierbei ist noch, dass ein aktualisieren der DB über den Installer keine Änderung hervorbringt und unter dem Punkt "Kollation" automatisch der Punkt "utf8mb4_bin" vorausgewählt ist.

    Wenn ich es schaffen würde, dass er in dem Zustand, dass nur das "dbCharset" umgestellt ist (wie von dir beschrieben) und die eine Tabelle händisch auf "utf8mb4_unicode_ci" gesetzt wurde korrekt speichert, wäre ich schon mal einen riesigen Schritt weiter. Da hänge ich im Moment aber noch.

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Hattest du auch tatsächlich alle Felder der Tabelle auf utf8mb4_unicode_ci umgestellt?

  7. #7
    Contao-Nutzer
    Registriert seit
    11.09.2016.
    Beiträge
    79

    Standard

    Nope, das hatte ich jetzt bewusst nicht gemacht. Ich wollte ja gerne herausfinden, ob es auch möglich ist, nur eine Tabelle zu ändern und den Rest im Originalzustand zu lassen.

    Ich habe in einer sauberen Contao Installation (ohne weitere Plugins) nochmal alles wie oben beschrieben nachgestellt und zusätzlich händisch alle Tabellen auf utfmb4_unicode_ci gestellt.
    Nach einer Aktualisierung der DB und dem Hinzufügen der folgenden Felder in die dcaconfig.php

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_files']['config']['sql']['keys']['path'] = 'index(250)'
    $GLOBALS['TL_DCA']['tl_member']['config']['sql']['keys']['email'] = 'index(250)';
    $GLOBALS['TL_DCA']['tl_user']['config']['sql']['keys']['email'] = 'index(250)';
    $GLOBALS['TL_DCA']['tl_version']['config']['sql']['keys']['fromTable'] = 'index(250)';
    $GLOBALS['TL_DCA']['tl_newsletter_recipients']['config']['sql']['keys']['email'] = 'index(250)'
    sind auch fast alle Fehlereinträge verchwunden. Lediglich die tl_search scheint noch Probleme zu bereiten:
    tl_search.jpg

    Beim Aktualisieren der DB erscheint folgende Fehlermeldung:

    PHP-Code:
    Fatal errorUncaught exception Exception with message Query errorSpecified key was too longmax key length is 1000 bytes (ALTER TABLE `tl_searchCHANGE `url` `urlvarchar(255NOT NULL default '';) thrown in system\modules\core\library\Contao\Database\Statement.php on line 295 
    Muss bei dieser Tabelle der Index noch wieder anders behandelt werden?
    Bis hierhin ist dann aber sonst alles so wie du gesagt hattest. Ich müsste in einem nächsten Schritt dann testen, ob ich die ausstehenden Probleme mit meiner anderen Contao Instanz, bei der noch weitere Plugins installiert sind, auch zu lösen sind.

  8. #8
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Ich meinte nicht alle Tabellen, ich meinte alle Felder der einen Tabelle .

  9. #9
    Contao-Nutzer
    Registriert seit
    11.09.2016.
    Beiträge
    79

    Standard

    Stimmt, hattest du auch geschrieben... hätte ich mal richtig lesen sollen
    Tatsächlich hat die Tabelle (da zum Testen angelegt) nur die Felder id, tstamp und msg.
    Das Feld msg ist vom Typ varchar(255) und ist auf utf8mb4_unicode_ci gestellt. Die ersten beiden Felder lassen sich nicht umstellen (beides int(10)).

    Illuster weise habe ich nun noch einen weiteren Zustand geschaffen:
    Ich habe im Install-Tool alles wieder auf UTF8 und utf8_general_ci zurückgesetzt und die Tabellen aktualisieren lassen.
    Jetzt ist a) nur noch meine Demo-Tabelle (welche noch auf utf8mb4_unicode_ci) gestellt ist in der Liste der nicht aktuellen Tabellen zu sehen:

    PHP-Code:
    ALTER TABLE `tl_demo_msgCHANGE `msg` `msgvarchar(255NOT NULL default ''
    und b) funktioniert das Speichern der Emojis jetzt auch in dieser Konstellation... warum auch immer (ich verstehe die Zusammenhänge hier nicht (mehr) so ganz, muss ich zugeben).
    Jetzt müsste Contao nur noch diesen Sonderfall der Tabelle akzeptieren...

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Poste ein Issue auf GitHub im core-bundle diesbezüglich. Der UTF8MB4 Support sollte vorangetrieben werden.

  11. #11
    Contao-Nutzer
    Registriert seit
    11.09.2016.
    Beiträge
    79

    Standard

    Okay, das werde ich mal machen. Ich wollte nur sichergehen, dass ich den "Make Utf8MB4 great again" Button nicht übersehen habe, wodurch doch noch alles problemlos läuft und es tatsächlich noch Komplikationen zu geben scheint.

    Danke für den Input!
    Geändert von *igi* (20.11.2017 um 09:53 Uhr)

  12. #12
    Contao-Nutzer
    Registriert seit
    11.09.2016.
    Beiträge
    79

    Standard

    Ich habe meine Erfahrungen und die dabei entdeckten Probleme und Auffälligkeiten mal zusammengetragen und ein Issue bei GitHub erstellt: https://github.com/contao/core-bundle/issues/1201
    Vielleicht hilft es ja dabei, Fehler zu beheben und nachzuvollziehen, wo diese auftreten.
    Geändert von *igi* (27.11.2017 um 06:57 Uhr)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •