Projekt

Allgemein

Profil

Aktionen

Bug #229

offen

[Bugsink] TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\SqlErrorException: An exception occurred while executing a query: Incorrect string value: '\x…

Von Bug Sink vor etwa 1 Monat hinzugefügt.

Status:
Neu
Priorität:
wichtig
Zugewiesen an:
-
Beginn:
12.09.2026
Abgabedatum:
% erledigt:

0%

Geschätzter Aufwand:

Beschreibung

Bugsink: https://bugsink.cytrus.de/issues/issue/29276d9b-eee8-4fe2-90c3-98ac5f35b5c2/event/last/

Typ: NEW issue

Projekt: www-verl-de

Bugsink Alert

TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\SqlErrorException: An exception occurred while executing a query: Incorrect string value: '\x…


Automatisch erstellt durch n8n

KI-Analyse:

1. Ursache identifizieren (Root Cause)

Fehler: mysqli_sql_exception: Incorrect string value: '\\xC0\\xA7\\xC0\\xA2%2...' for column 'description' at row 1

Analyse der Byte-Sequenz:

  • \\xC0\\xA7 und \\xC0\\xA2 sind ungültige UTF-8-Sequenzen (Overlong Encodings).
  • Im Standard-UTF-8 dürfen Codepoints U+0080 bis U+07FF nicht mit dem Startbyte 0xC0 kodiert werden (korrekt wäre 0xC2 bzw. 0xC3).
  • 0xC0 0xA7 entspricht dem Overlong-Encoding für § (U+00A7).
  • 0xC0 0xA2 entspricht dem Overlong-Encoding für ¢ (U+00A2).
  • Der Suffix %2... deutet auf URL-Encoding hin (%20 = Space, %25 = %), was nahelegt, dass die Daten über einen HTTP-Request (POST/GET Body oder Query Parameter) hereinkamen.

Datenbank-Kontext:

  • TYPO3 v10+ nutzt standardmäßig utf8mb4 (Strict Mode).
  • utf8mb4 lehnt invalid byte sequences strikt ab (im Gegensatz zum alten utf8mb3, das sie oft stillschweigend abschnitt oder fehlerhaft speicherte).

Eintrittspfad (Rückschluss aus Stacktrace):
Der Stacktrace zeigt nur den TYPO3 Bootstrap & Middleware Stack (VerifyHostHeader, NormalizedParamsAttribute, ResponsePropagation). Der eigentliche Controller/Service/Command, der den INSERT/UPDATE auf die Spalte description ausführt, ist nicht im Stacktrace enthalten (vermutlich durch Exception Handling / Logging abgeschnitten).
Die Schreiboperation findet nach der Middleware-Kette statt (im Controller/Extbase/Repository).


2. Fix beschreiben (konkret)

Da der fehlerhafte Datensatz vor dem Persistieren bereinigt werden muss, gibt es zwei Ebenen der Behebung:

A. Sofortmaßnahme / Hotfix (Data Sanitization am Eintrittspunkt)

Im betroffenen Controller / Service / Repository / Command vor dem $persistenceManager->persistAll() oder $entity->setDescription():

use TYPO3\CMS\Core\Utility\GeneralUtility;

// $rawInput kommt aus Request, CSV, API, Formular, etc.
$cleanDescription = GeneralUtility::fixUTF8Charset($rawInput); 
// ODER (PHP native, ab PHP 7.2+ robust):
$cleanDescription = mb_convert_encoding($rawInput, 'UTF-8', 'UTF-8'); // Entfernt ungültige Sequenzen stillschweigend
// ODER (strenger, wirft Exception bei Fehlern):
// $cleanDescription = mb_convert_encoding($rawInput, 'UTF-8', 'UTF-8'); if (!mb_check_encoding($cleanDescription, 'UTF-8')) { throw new \InvalidArgumentException('Invalid UTF-8'); }

$entity->setDescription($cleanDescription);

Wichtig: GeneralUtility::fixUTF8Charset() nutzt intern iconv/mbstring und ist der TYPO3-Standardweg, um "kaputtes" UTF-8 (Overlong, Surrogates, BOMs) zu reparieren.

B. Architektur-Fix (Empfohlen: Input Validation / Middleware)

Wenn die Daten über Formulare (EXT:form), REST-API oder Imports hereinkommen:

  1. Validation Rule hinzufügen (z. B. TYPO3\CMS\Extbase\Validation\Validator\StringValidator mit Custom Option oder eigener Utf8Validator).
  2. PSR-15 Middleware registrieren (vor NormalizedParamsAttribute), die getParsedBody() / getQueryParams() rekursiv durchläuft und mb_convert_encoding($v, 'UTF-8', 'UTF-8') anwendet.

C. Datenbank-Check (Nur zur Diagnose)

Prüfen, ob die Spalte wirklich utf8mb4 hat:

SHOW CREATE TABLE `deine_tabelle`; 
-- Erwartet: CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci (oder _general_ci)

Nicht auf latin1 oder utf8mb3 downgraden – das verschiebt nur das Problem (Datenverlust bei Emojis/CJK).


3. Betroffene TYPO3 Extension nennen

❌ Nicht aus dem Stacktrace ableitbar.

Der Stacktrace endet im Core Middleware Dispatcher. Der fehlende Frame (Controller/Action/Repository) wurde durch das Exception-Logging abgeschnitten.

Wahrscheinliche Verdächtige (basierend auf Spaltenname description & Eingabevektor HTTP):

Extension / Bereich Wahrscheinlichkeit Grund
Projekt-spezifische Extension (sitepackage, custom_ext) Sehr Hoch Eigenes Model/Repository mit Feld description, eigener Controller/Command/Importer.
EXT:form Hoch Formular-Abgabe (Textarea) -> Finisher (DB/Email) -> Speicherung in tx_form_definition oder Custom Table.
EXT:news Mittel tx_news_domain_model_news.description (RTE/Bodytext Input).
EXT:tt_address / EXT:tt_content Mittel Redaktionelle Pflege im Backend (RTE Copy&Paste aus Word/Outlook -> Overlong Sequences).
EXT:solr / EXT:ke_search Gering-Mittel Indexer schreibt Metadaten in DB-Log-Tabellen (description Feld).
Custom API / Import (Scheduler Task) Hoch CSV/XML/JSON Import ohne UTF-8 Validierung (z. B. fgetcsv ohne Encoding-Check).

Empfehlung: Suche im Projekt-Code nach:

  • ->setDescription(
  • description in TCA config / columns
  • SQL INSERT INTO ... description in eigenen Repositories/Commands.

4. Confidence (0-100%)

95%

  • 100% Sicherheit: Fehlerursache = Ungültige UTF-8 Byte-Sequenzen (Overlong Encoding 0xC0 0xA7) bei Schreibversuch in utf8mb4 Spalte.
  • 100% Sicherheit: Fix = Input Sanitization via GeneralUtility::fixUTF8Charset() / mb_convert_encoding(... 'UTF-8', 'UTF-8').
  • ~50% Sicherheit: Genauer Ort (Extension/Controller), da der Stacktrace abgeschnitten ist. Die Spalte description ist generisch.

Nichts anzuzeigen

Aktionen

Auch abrufbar als: Atom PDF