Alamat halaman yang lebih panjang dari kolomnya
Pada 9 Agustus 2026, dua puluh gambar penghitung gagal ditampilkan. Bukan tergambar salah, bukan tergambar lambat — pengunjung sama sekali tidak mendapatkan apa pun di tempat yang seharusnya ada penghitung.
Penyebabnya adalah alamat halaman yang lebih panjang dari 255 karakter. Kini alamat itu dipangkas saat ditulis, dan gambar penghitung tidak lagi bergantung pada panjang alamat yang dilaporkan kepadanya.
Rantainya
Kolom yang menyimpan halaman tujuan sebuah kunjungan adalah varchar(255). Alamat yang datang lebih panjang dari itu. Insert gagal dengan SQLSTATE 22001, data terlalu panjang untuk kolom, yang dalam kode ini memunculkan eksepsi.
Dan penulisan statistik terjadi sebelum gambar dibuat. Jadi eksepsi itu tidak hanya menghilangkan satu baris statistik. Eksepsi itu menghentikan permintaan, dan permintaan itulah yang menghasilkan gambar penghitung. Halaman dengan alamat panjang merusak penghitungnya sendiri, tanpa pesan apa pun, untuk setiap pengunjung.
Alamat panjang bukan hal yang aneh. Galeri dengan jalur bertingkat, toko dengan belasan parameter pelacakan yang ditambahkan platform iklan, halaman hasil pencarian — semua ini dengan mudah melampaui 255 karakter.
Perbaikannya, dan perbaikan yang tidak dipilih
Alamat kini dipotong sesuai lebar kolom sebelum insert. Dua puluh karakter dari URL yang sangat panjang hilang dari daftar halaman; tidak ada hal lain yang berubah.
Alternatifnya adalah melebarkan kolom. Pilihan itu ditolak: tidak ada lebar yang tidak dapat dilampaui, dan memilih angka yang lebih besar hanya memindahkan kegagalan yang sama lebih jauh, sehingga lebih sulit dikenali ketika akhirnya terjadi. Kegagalan ini harus berhenti berakibat fatal, bukan sekadar menjadi lebih jarang.
Membungkus insert dalam try/catch juga akan memperbaiki gejala yang terlihat, dan hasilnya justru lebih buruk: penghitung akan tergambar, barisnya diam-diam hilang, dan daftar halaman akan kehilangan tepat halaman-halaman dengan alamat paling rumit, selamanya, tanpa jejak di log mana pun.
Dua hal yang patut dipetik
Masukan dari luar harus dipangkas sesuai lebar kolom, bukan diharapkan muat. Apa pun yang datang dari luar — alamat, perujuk, user agent, judul — panjangnya ditentukan oleh orang lain, dan basis data punya pendapat tentang hal itu, yang diungkapkannya dengan menolak.
Ketahui apa saja yang ikut terdampak oleh sebuah kegagalan. Ini adalah bug statistik dalam layanan statistik, dan kerusakan yang terlihat adalah gambar yang hilang. Penulisan dan penggambaran berbagi satu permintaan; tidak ada apa pun di kode yang menyatakan keduanya terkait, dan tidak ada yang memperingatkan bahwa insert yang gagal akan ikut menghilangkan gambarnya.
Dua puluh gambar rusak dalam sehari itu kecil. Masalah ini ditemukan saat membaca log untuk urusan yang sama sekali berbeda, yang memang cara biasa hal seperti ini ditemukan, dan itulah alasan untuk terus membacanya.