Bug #229
offen[Bugsink] TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\SqlErrorException: An exception occurred while executing a query: Incorrect string value: '\x…
0%
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\\xA7und\\xC0\\xA2sind ungültige UTF-8-Sequenzen (Overlong Encodings). - Im Standard-UTF-8 dürfen Codepoints U+0080 bis U+07FF nicht mit dem Startbyte
0xC0kodiert werden (korrekt wäre0xC2bzw.0xC3). -
0xC0 0xA7entspricht dem Overlong-Encoding für§(U+00A7). -
0xC0 0xA2entspricht 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). -
utf8mb4lehnt invalid byte sequences strikt ab (im Gegensatz zum altenutf8mb3, 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 interniconv/mbstringund 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:
-
Validation Rule hinzufügen (z. B.
TYPO3\CMS\Extbase\Validation\Validator\StringValidatormit Custom Option oder eigenerUtf8Validator). -
PSR-15 Middleware registrieren (vor
NormalizedParamsAttribute), diegetParsedBody()/getQueryParams()rekursiv durchläuft undmb_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(-
descriptionin TCAconfig/columns - SQL
INSERT INTO ... descriptionin eigenen Repositories/Commands.
4. Confidence (0-100%)¶
95%
-
100% Sicherheit: Fehlerursache = Ungültige UTF-8 Byte-Sequenzen (Overlong Encoding
0xC0 0xA7) bei Schreibversuch inutf8mb4Spalte. -
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
descriptionist generisch.
Nichts anzuzeigen