サポートに連絡

メールでご返信します。通常は2日以内です。

不正利用を防ぐため、Google reCAPTCHA がこの送信を確認します。その際データが Google に送られます。スクリプトはこのフォームを開いたときにだけ読み込まれます。

← すべての記事

長いアドレスがカウンターを倒した

2026 年 8 月 9 日、二十枚のカウンター画像が描かれませんでした。誤って描かれたのでも、遅く描かれたのでもありません — 訪問者はカウンターがあるはずの場所で何も受け取れませんでした。

原因は 255 文字を超えるページのアドレスでした。

連鎖

訪問がどのページに着いたかを記録する列は varchar(255) です。アドレスはそれより長く届きました。挿入は SQLSTATE 22001、列に対してデータが長すぎる、で失敗し、このコードではそれが例外になります。

そして統計の書き込みは画像を描くに起きます。つまり例外は統計の一行を失っただけではありません。リクエストそのものを中断させ、そのリクエストこそがカウンターの絵を作るものでした。長いアドレスを持つページが、自分のカウンターを、静かに、すべての訪問者に対して壊していたのです。

長いアドレスは珍しくもありません。入れ子のパスを持つギャラリー、広告基盤が十数個の追跡パラメータを付ける店舗、検索結果ページ — どれも 255 文字を苦もなく超えます。

とった直し方と、とらなかった直し方

アドレスは挿入前に列の幅へ切り詰められるようになりました。非常に長いアドレスはページ一覧で二十文字ほど欠けます。それ以外は何も変わりません。

代案は列を広げることでした。見送りました。超えられない幅というものは存在せず、より大きな数字を選ぶことは同じ故障をより遠くへ、来たときにより気づきにくい場所へ押しやるだけです。故障のしかたが致命的でなくなる必要があるのであって、まれになる必要があるのではありません。

挿入を try/catch で包んでも見えている症状は治ります。そしてそれはもっと悪い。カウンターは描かれ、行は静かに消え、ページ一覧からはいちばん複雑なアドレスのページだけが永久に抜け落ち、どこにも記録は残りません。

持ち帰るべき二つ

外から来た入力は列の幅に切り詰めるもので、収まることを願うものではありません。外から届くもの — アドレス、参照元、ブラウザの識別、タイトル — は、他人が決めた長さです。データベースはそれについて意見を持っており、拒否という形でそれを表明します。

自分の故障のしかたの下流に何がぶら下がっているかを知ること。これは統計サービスにおける統計の不具合で、目に見えた被害は画像の欠落でした。書き込みと描画は一つのリクエストを共有していました。コードのどこにも両者が結び付いているとは書かれておらず、挿入の失敗が画像を道連れにするとも警告されていませんでした。

一日に二十枚の壊れた画像は少ない数です。見つかったのはまったく別の用事でログを読んでいたときで、これはこの種のものが見つかる普通のやり方であり、ログを読み続ける理由でもあります。

広告