integerのサイズ指定で困ったことがあったため備忘録として残します。
結論だけ見たい人はクリックME
#【概要】
laravelの便利機能の一つマイグレーション。
多くの人は新規開発の際、これを利用してDB構築をする人が多いと思います。
g
その際、カラムで指定した型の長さを明示的に指定する場合もあります。
(サーバの記憶領域が多きくなった昨今、意味もなく長さ指定するのは逆にNG)
特にでコード値を保存しますよーってパターンはほぼ必ずあると思います。
例えば、都道府県マスタを作成する際、皆さんほぼほぼJIS X0401
をベースにテーブル定義をすると思います。
//prefsマイグレーション
public function up()
{
Schema::create('prefs', function (Blueprint $table) {
// JIS X0401に準拠して01~47が入るためstring(verchar(2))で定義
$table->string('pref_code',2)->unique()->comment('都道府県コード');
$table->string('pref_name')->comment('都道府県名');
});
}
ミニマムですが、基本的に上記のような書き方になると思います。
では、今度は性別マスタを例にあげてみます。(実際はこんなマスタはACCESS以外作らないと思う)
性別も一応ISOが定めているため、ISO 5218
をベースに定義してみましょう。
コードは0、1、2、9の整数を使用するので今度は整数型で定義しましょう。
//sexマイグレーション
public function up()
{
Schema::create('sex', function (Blueprint $table) {
// ISO 5218
$table->integer('sex_code')->length(1)->unique()->comment('性別コード');
$table->string('sex_name')->comment('名称');
});
}
はい。たぶんミニマムだとこんな感じになると思います。
では、最後に小数を扱うカラム
の場合どうなるのか?
面倒なので、テーブルは適当。
//hogeマイグレーション
public function up()
{
Schema::create('hoge', function (Blueprint $table) {
// 総桁8の小数点以下2桁以内
$table->float('column1', 8, 2);
// 総桁15の小数点以下8桁
$table->double('column2', 15, 8);
// 総桁5の小数点以下2桁
$table->decimal('column3', 5, 2);
});
}
こういう感じなります。
#【結論】
はい。感のいい方は気が付いていると思いますが、
integer
はサイズを指定するときlength(N)
でチェーンしなきゃあかん。
こいつ以外のやつはご紹介した通り、第2引数以降でサイズの指定をしているのになんでだよ。
Laravelがそうしろっていうんだから仕方ない。
はい。
ということで、長くなりましたが、間違ってもintegerの第二引数にサイズを指定しない
ようにしましょう。
間違った場合どうなるのって?
早い話が、主キー扱いになってphp artisan migrate
コマンドたたいた時に「なんで?なんで?エラーなんで??」ってなります。
まぁ、一緒に実行されたクエリも帰ってきますが、そのクエリを見るとおかしいのはわかりますが、サイズの指定方法が間違っているとマイグレーションファイルのどこの記述がおかしいのって?なります。
こんなことに1時間費やした。
以上です。
余談だけど、〇〇コードを使うってなったらDBだろうが何だろうがJISとかISOとかIEEEだろうが(IEEEはたぶんコード関係はないと思う)標準化機構によって定められた規格ないかな~?って思考をもってコーディングしていきたいです。