Адрес на страница, по-дълъг от колоната си
На 9 август 2026 г. двайсет изображения на броячи не успяха да се изобразят. Не се изобразиха грешно, не се изобразиха бавно — посетителят не получи абсолютно нищо там, където трябваше да има брояч.
Причината беше адрес на страница, по-дълъг от 255 знака. Сега той се съкращава в момента на записа и изображението на брояча вече не зависи от дължината на адреса, който му се съобщава.
Веригата
Колоната, в която се пази на коя страница е попаднало посещението, е varchar(255). Адресът пристигна по-дълъг от това. Вмъкването се провали с SQLSTATE 22001, твърде дълги данни за колоната, което в този код предизвика изключение.
А записът в статистиката става преди изобразяването на картинката. Така изключението не просто загуби един ред статистика. То прекъсна заявката, а заявката беше именно тази, която създава картинката на брояча. Страница с дълъг адрес развали собствения си брояч, безшумно, за всеки посетител.
Дългите адреси не са екзотика. Галерия с вложени пътища, магазин с дузина параметри за проследяване, добавени от рекламна платформа, страница с резултати от търсене — всяка от тях надхвърля 255 знака без никакво усилие.
Поправката и поправката, която не беше избрана
Сега адресът се отрязва до ширината на колоната преди вмъкването. Двайсет знака от много дълъг URL адрес се губят от списъка със страници; нищо друго не се променя.
Алтернативата беше колоната да се разшири. Тя беше отхвърлена: няма ширина, която да не може да бъде надхвърлена, а изборът на по-голямо число само отмества същия срив по-далеч, където ще бъде по-трудно разпознат, когато дойде. Сривът трябва да престане да бъде фатален, а не да стане по-рядък.
Обвиването на вмъкването в try/catch също би поправило видимия симптом и би било по-лошо: броячът щеше да се изобрази, редът тихо щеше да изчезне, а в списъка със страници завинаги щяха да липсват точно страниците с най-сложните адреси, без следа в който и да е дневник.
Две неща, които си струва да запомним
Външните входни данни трябва да се съкращават до ширината на колоната, а не да се надяваме, че ще се съберат. Всичко, което идва отвън — адрес, препращащ сайт, идентификатор на браузъра, заглавие — е толкова дълго, колкото някой друг е решил, а базата данни има мнение по въпроса, което изразява с отказ.
Знайте какво още зависи от мястото на срива. Това беше грешка в статистиката на услуга за статистика, а видимата щета беше липсващо изображение. Записът и изобразяването споделяха една заявка; нищо в кода не показваше, че са свързани, и нищо не предупреждаваше, че провалено вмъкване ще повлече и картинката.
Двайсет счупени изображения за един ден са малко. Грешката беше открита при четене на дневниците за нещо съвсем друго — обичайният начин такива неща да се откриват и причината дневниците да продължават да се четат.