ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

予想外のテーブル設計のためにデータインポートでエラー発生

システム運用を依頼されているシステムに、データをインポートしていてエラーが発生しました。
インポートプログラムはありますが、インポートプログラムでチェックされていない内容のエラーで、データベースが出力するエラーが表示されました。

f:id:AJYA:20160122150829j:plain
photo credit: Database Structure via photopin (license)

エラー発生データを絞込み

100件以上あるデータを半分に分けて、インポートを行い、エラーが発生する半分のデータをさらに半分に分けて・・・・と繰り返しました。
エラーが発生するデータを特定して目視で確認しましたが、エラーが発生するようには見えません。
データのフォーマットもおかしくなく、データの形式も正しそうで特殊な文字も使われていなさそうです。

エラー発生要因を特定

データの文字列が長すぎて、カラムで定義しているバイト数を超えているために発生しているのではないかと考えました。
文字列が長いデータを1個ずつ短くして試していくと、2個目に文字列を短くしたらエラーが発生しなくなりました。
2個目以外を元に戻して再度試すとエラーは発生しなくなったので、発生要因を特定できました。

原因特定

発生要因は特定できましたが、なぜ発生するのかが理解できていません。
短くしたデータが格納されるはずのデータベースのテーブル定義を確認しても、十分なバイト数を定義されていそうです。
テーブルへのデータの格納状態を見て、やっと原因がわかりました。

該当するカラムは、VARCHAR(200)で定義されていますが、このカラムにインポートするデータの複数項目を連結しているために、文字列が長すぎるためでした。

対処

カラムの定義を修正することはなく、該当のデータを短くしてもらうことで対処することになりました。

なぜこんな設計?

複数項目を連結せず、単独の項目としてデータベースに格納して、表示する際に連結すればいい筈です。
運用を依頼されていて、なぜこのような設計をされたのかまではわかりませんが、どれだけの長さを確保すれば後々も困らないのかを考えたら、このような設計をしてほしくなかったです。