Eine lange Adresse legte den Zähler lahm
Am 9. August 2026 kamen zwanzig Zählerbilder nicht zustande. Nicht falsch gezeichnet, nicht langsam gezeichnet — der Besucher bekam gar nichts an der Stelle, an der ein Zähler stehen sollte.
Die Ursache war eine Seitenadresse mit mehr als 255 Zeichen.
Die Kette
Die Spalte, die festhält, auf welcher Seite ein Besuch landete, ist varchar(255). Die Adresse kam länger an. Das Einfügen scheiterte mit SQLSTATE 22001, Daten zu lang für die Spalte, was in diesem Code eine Ausnahme auslöst.
Und das Schreiben der Statistik geschieht vor dem Zeichnen des Bildes. Die Ausnahme verlor also nicht bloß eine Zeile Statistik. Sie brach die Anfrage ab, und die Anfrage war genau die, die das Zählerbild erzeugt. Eine Seite mit langer Adresse machte ihren eigenen Zähler kaputt, lautlos, für jeden Besucher.
Lange Adressen sind nichts Exotisches. Eine Galerie mit verschachtelten Pfaden, ein Laden mit einem Dutzend Nachverfolgungsparametern, die eine Werbeplattform anhängt, eine Suchergebnisseite — jede davon knackt 255 Zeichen ohne Mühe.
Die Lösung, und die, die nicht gewählt wurde
Die Adresse wird jetzt vor dem Einfügen auf die Spaltenbreite gestutzt. Von einer sehr langen Adresse fehlen zwanzig Zeichen in der Seitenliste; sonst ändert sich nichts.
Die Alternative wäre gewesen, die Spalte zu verbreitern. Sie fiel aus: es gibt keine Breite, die nicht überschritten werden kann, und eine größere Zahl schiebt dasselbe Scheitern nur weiter weg, wo es schwerer zu erkennen sein wird, wenn es kommt. Der Fehlerfall muss aufhören, tödlich zu sein, nicht seltener werden.
Das Einfügen in ein try/catch zu hüllen hätte das sichtbare Symptom ebenfalls behoben, und es wäre schlimmer gewesen: der Zähler zeichnete, die Zeile verschwände still, und in der Seitenliste fehlten für immer genau die Seiten mit den kompliziertesten Adressen, ohne einen Eintrag irgendwo.
Zwei Dinge zum Mitnehmen
Fremdeingabe gehört auf die Spaltenbreite gestutzt, nicht darauf gehofft, dass sie hineinpasst. Alles, was von außen kommt — eine Adresse, eine Herkunftsangabe, eine Browserkennung, ein Titel — ist so lang, wie jemand anders entschieden hat, und die Datenbank hat dazu eine Meinung, die sie durch Verweigern ausdrückt.
Wisse, was sonst noch hinter deinem Fehlerfall hängt. Das war ein Statistikfehler in einem Statistikdienst, und der sichtbare Schaden war ein fehlendes Bild. Schreiben und Zeichnen teilten sich eine Anfrage; nichts im Code sagte, dass sie gekoppelt sind, und nichts warnte, dass ein gescheitertes Einfügen das Bild mitnimmt.
Zwanzig kaputte Bilder an einem Tag ist wenig. Gefunden wurde es beim Lesen von Protokollen wegen etwas ganz anderem, was der übliche Weg für solche Funde ist und der Grund, sie weiter zu lesen.