SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'c1stageware1.product.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Den bekommen nur diejenigen, die MySQL Datenbanken verwenden. Der Fehler kommt unter anderem wenn man etwas in der Suche eingibt oder auf das Warenkorb Icon im Header klickt.

  1. 1.Anpassung über phpmyadmin
  2. 2.Anpassung über SSH / Konsole
  3. 3.Anpassung bei Managed Servern
  4. 4.Anmerkung zu MySQL Versionen
  5. 5.Weiterführende Links und Quellen

1. Anpassung über phpmyadmin?

Nach etwas Recherche konnte ich herausfinden wie man diesen Modus bei einer bestimmten Datenbank anpassen kann. Das wollte ich über phpmyadmin probiert, nachdem ich aber das hier gelesen hatte, sah ich davon wieder ab:

Beachte, dass diese Änderung nur für die aktuelle Sitzung gilt. Wenn du möchtest, dass die Änderung dauerhaft ist, müsstest du sie serverweit oder auf Datenbankebene vornehmen. Also: Bringt nix mit phpmyadmin.

Was wir aber schonmal machen können ist, die Einstellungen der Staging Datenbank mit denen der Live-Datenbank zu vergleichen.

Kicke auf den Namen der Datenbank, z.B. c1stageware1 und anschließend auf den SQL Reiter und gib diesen Befehl ein:

SHOW VARIABLES LIKE ’sql_mode‘;

Um den gesamten Inhalt angezeigt zu bekommen musst du noch auf den „Zusätzliche Optionen“ Button klicken. Wenn du das nicht machst, kann es sein, dass am Ende der Inhalt gekürzt mit drei Punkten angezeigt wird.

SQL_MODE Fehler - phpmyadmin

phpmyadmin

So sah bei mir das Ergebnis auf der Datenbank der Staging Umgebung aus:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Und so auf der Live Umgebung:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Heißt… wir haben schonmal eine Spur!

Für die aktuelle Session könnten wir es nun so anpassen:

SET SESSION sql_mode = ‚STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION‘;

Aber: Es bringt nix ;)

2. Anpassung über SSH / Konsole

Hat bei mirnicht wifklich geklappt aber das wäre der ungefähre Weg dahin was aber in der Regel nur funktioniert wenn das Hosting / der Server nicht managed ist.

a) Auf dem Server anmelden, z.B. so:
ssh k51s11.meinserver.io -l c1234567_w5_ssh1

Dann wird das SSH / Shell-Benutzer Passwort abgefragt.

b) Bei mysql anmelden
Nachdem du dich erfolgreich über SSH auf deinem Server eingeloggt hast, melde dich bei MySQL an, indem du den folgenden Befehl eingibst und Enter drückst:

mysql -u dein_mysql_benutzername -p

Ersetze dein_mysql_benutzername durch deinen MySQL-Benutzernamen. Du wirst dann nach deinem Passwort für MySQL gefragt.

c) Aktuelle sql_mode-Einstellungen anzeigen (wenn nicht schon über phpmyadmin geschehen):
Nachdem du dich erfolgreich in MySQL angemeldet hast, gib den folgenden Befehl ein und drücke Enter, um die aktuellen sql_mode-Einstellungen anzuzeigen:

SELECT @@sql_mode;

Dadurch werden die aktuellen sql_mode-Einstellungen zurückgegeben, damit du sie überprüfen kannst.

Sagen wir mal es wäre so wie bei mir das hier:

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Am Anfang müsste also noch ONLY_FULL_GROUP_BY ergänzt werden.

d) only_full_group_by-Modus aktivieren:
Gib den folgenden Befehl ein und drücke Enter, um den only_full_group_by-Modus hinzuzufügen:

SET GLOBAL sql_mode = ‚ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION‘;

Hier haben wir also das Ergebnis aus c) genommen und um den fehlenden Eintrag ONLY_FULL_GROUP_BY ergänzt. Beachte, dass dies den Modus global für den MySQL-Server ändert, was sicher Sinn macht wenn dort ausschließlich Shopware 6 Instanzen laufen. Wenn du ihn nur für eine bestimmte Datenbank ändern möchtest, kannst du GLOBAL durch SESSION ersetzen.

3. Anpassung bei Managed Servern

Wer unseren Blog regelmäßig besucht weiß, dass wir auf die Server von Timme Hosting setzen. Wer dort eine SQL-Datenbank benutzt muss die Anpassung in seinem ISP-Config Bereich vornehmen. Klicke hierfür links in der Sidebar auf Datenbanken. Klicke auf die Einstellungen der Datenbank die du ändern möchtest. Scrolle etwas nach unten und öffne den Bereich Erweiterte Einstellungen.

SQL_MODE Fehler - DB Einstellung

SQL_MODE Fehler – DB Einstellung

In der Box Datenbank-Einstellungen (optional) musst du nun folgende Zeile eingeben und speichern:

–sql-mode=“STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION“

Die Einstellung kann nicht global eingerichtet werden, sondern muss bei jeder Datenbank einzeln vorgenommen werden. Die Einstellung greift bereits nach einer Minute und daraus resultierende Fehler gehören der Vergangenheit an wie das rote Bändchen zum öffnen der Verpackung von Milchschnitte.

4. Anmerkung zu MySQL Versionen und Nutzung

Shopware empfiehlt grundsätzlich die Nutzung von MySQL Datenbanken statt MariaDB oder InnoDB Datenbanken. Es ist aber definitiv ein wenig komplizierter und nerviger, weil man einfach mehr beachten muss, als wenn man einfach eine MariaDB nutzen würde.

In den SW-Docs heißt es:

MySQL 8.0 oder höher
Die MySQL Versionen 8.0.20 und 8.0.21 sind aufgrund von technischen Problemen in diesen Versionen nicht kompatibel.

oder

MariaDB 10.11 oder höher
Die MariaDB Versionen 10.11.5 und 11.0.3 sind aufgrund von technischen Problemen in diesen Versionen nicht kompatibel.

Dabei steht auch noch:

Für eine optimale MySQL Performance werden mindestens 32 MB empfohlen.

hierzu findet man mehr in den Developer Docs:

• Make sure that group_concat_max_len is by default higher or equal to 320000
• Make sure that sql_mode doesn’t contain ONLY_FULL_GROUP_BY
• After this change, you can set also SQL_SET_DEFAULT_SESSION_VARIABLES=0 in the .env file so Shopware does not check for those variables at runtime.

In den Dev Docs erfahren wir auch weiter noch das hier:

• Recommended version: 8.0
• Minimum version: 8.0.17
• Problematic versions: 8.0.20, 8.0.21

Und hier noch einmal abschließend die Empfehlung von Shopware:

Recommended stack
We recommend the following stack:

• Webserver: Caddy
• PHP: 8.2
• SQL: MySQL 8 or Percona MySQL 8
• Node: 20
• Search: OpenSearch 2.8.0
• Queue: RabbitMQ
• Redis: 7.2

P.S.: Der Support von MySQL 5.7 endete am 31. Oktober 2023 Shopware 6.4 lief damit jedoch noch. Bei Shopware 6.5 ist 8.0 die Mindestandforderung.

5. Weiterführende Links und Quellen:

Shopware Docs – Shopware 6 Systemvoraussetzungen
https://docs.shopware.com/de/shopware-6-de/erste-schritte/systemvoraussetzungen

Shopware Developer:
https://developer.shopware.com/docs/guides/installation/requirements.html
https://developer.shopware.com/docs/guides/hosting/infrastructure/database-cluster.html

Umstieg von SQL 5 auf SQL 8:
https://forum.shopware.com/t/sql-8-db-eintragen/100971
https://forum.shopware.com/t/shopware-6-4-zu-6-5-mysql-8-0-erforderlich-oder-nicht/100851/6