Длинный адрес уронил счётчик
9 августа 2026 года двадцать изображений счётчика не появились. Не нарисовались неправильно, не нарисовались медленно — посетитель не получил ничего там, где должен был стоять счётчик.
Причиной был адрес страницы длиннее 255 знаков.
Цепочка
Столбец, хранящий, на какую страницу пришло посещение, — varchar(255). Адрес пришёл длиннее. Вставка провалилась с SQLSTATE 22001, данные слишком длинны для столбца, что в этом коде поднимает исключение.
А запись статистики происходит до рисования изображения. Исключение, стало быть, потеряло не одну строку статистики. Оно оборвало запрос, а запрос был именно тем, который производит картинку счётчика. Страница с длинным адресом ломала собственный счётчик, молча, для каждого посетителя.
Длинные адреса не экзотика. Галерея с вложенными путями, магазин с дюжиной отслеживающих параметров, приклеенных рекламной площадкой, страница результатов поиска — любая из них берёт 255 знаков без труда.
Исправление и то, которое не выбрали
Адрес теперь режется до ширины столбца перед вставкой. У очень длинного адреса в списке страниц не хватает двадцати знаков; больше ничего не меняется.
Альтернативой было расширить столбец. Она отпала: нет ширины, которую нельзя превысить, а выбор большего числа лишь отодвигает тот же отказ туда, где его будет труднее распознать, когда он придёт. Режим отказа должен перестать быть смертельным, а не стать более редким.
Обернуть вставку в try/catch тоже сняло бы видимый симптом, и было бы хуже: счётчик рисовался бы, строка тихо исчезала бы, а в списке страниц навсегда не хватало бы именно тех страниц с самыми сложными адресами, без записи где бы то ни было.
Два вывода
Чужой ввод режут по ширине столбца, а не надеются, что он влезет. Всё, что приходит снаружи — адрес, источник перехода, строка браузера, заголовок — ровно такой длины, какую решил кто-то другой, и у базы данных на этот счёт есть мнение, которое она высказывает отказом.
Знайте, что ещё висит за вашим режимом отказа. Это была ошибка статистики в службе статистики, а видимым ущербом стала пропавшая картинка. Запись и рисование делили один запрос; ничто в коде не говорило, что они связаны, и ничто не предупреждало, что провалившаяся вставка утащит картинку с собой.
Двадцать сломанных картинок за день — немного. Нашлось при чтении журналов совсем по другому поводу, что обычный способ находить такое и причина продолжать их читать.