ID=32767で現れた謎のエラーの正体

少し前ですが、MySQL+PHPで組んでいるシステムで謎のエラーが発生しました。
調べてみると、あるデータが別のデータに置き換えられるという、これまで経験したことのない恐ろしい症状が出ています。
しかも、システムのアップデートを機にエラーが発生したのではなく、何もしていないのにある日突然狂いだすという症状でした。

まず、ハッキングされたのかと疑い、バックアップとの差異などを調べてみたものの、最新の一部のデータのみが上書きされており、データを壊された形跡がありません。
レンタルサーバーだったので、MySQLやPHPのバージョンアップ情報や障害情報がないか調べてみるも空振り。途方に暮れました。

色々と調べていくうちに、古いデータは正しく更新できるのに、新しいデータを登録すると、あるレコードが上書きされるテーブルがあることを突き止め、更に精査して、smallintのIDフィールドが最大値である32767になっていることが原因と分かりました。
文章にすれば数行ですが、嫌な汗は流れるし、時間はかかるしで散々だったので、皆様もお気を付けください。

教訓

  • smallintはあまり使わない方が良い。フラグならtinyint、auto_incrementのIDならばint(巨大システムならbigint)が無難か。
  • アップデートをしていないのにDB系のシステムが狂った場合は、int/smallint/tinyintがMAXに達している可能性があることを頭の片隅に記憶する。
  • 32,767という数字を頭の片隅に記憶する。
2015/4/15