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