Laravel のマイグレーション時に指定したカラムタイプで実際に作成されるカラムのデータ型を調べてみた

2022年1月4日

Laravel では、マイグレーション時にカラムタイプを指定することで RDBMS の違いを意識せずにカラムを作成することができますが、実際に作成されるカラムのデータ型は、当然のことながら、各 RDBMS に存在するものとなります。そこで、Laravel のカラムタイプと実際に作成されるデータ型を確認してみることにします。

カラムタイプと作成されるデータ型の対応については、Illuminate\Database\Schema\Grammars 以下に RDBMS ごとのクラス(MySqlGrammar など)が置かれています。この記事ではバージョン6系について、MySQL、PostgreSQL、SQLite、SQL Server の4つの RDBMS における実装を確認します。

カラムタイプMySQLPostgreSQLSQLiteSQL Server
bigIntegerbigintbigintintegerbigint
binaryblobbyteablobvarbinary(max)
booleantinyint(1)booleantinyint(1)bit
charcharcharvarcharnchar
datedatedatedatedate
dateTimedatetimetimestampdatetimedatetime または datetime2
decimaldecimaldecimalnumericdecimal
doubledoubledouble precisionfloatfloat
enumenumvarchar(255) check (“カラム名" in (“値1", “値2", …)varchar check (“カラム名" in (“値1", “値2", …)nvarchar(255) check (“カラム名" in ( “値1", “値2", … ))
floatdoubledouble precisionfloatfloat
integerintintegerintegerint
ipAddressvarchar(45)inetvarcharnvarchar(45)
jsonjsonjsontextnvarchar(max)
longTextlongtexttexttextnvarchar(max)
mediumIntegermediumintintegerintegerint
mediumTextmediumtexttexttextnvarchar(max)
smallIntegersmallintsmallintintegersmallint
stringvarcharvarcharvarcharnvarchar
texttexttexttextnvarchar(max)
timetimetimetimetime
timestamptimestamptimestampdatetimedatetime または datetime2
tinyIntegertinyintsmallintintegertinyint
yearyearintegerintegerint

各 RDBMS の考え方のようなものも見えて、面白い調査結果となりました。特に SQL Server は、Unicode の文字列を扱うために nvarchar を使うのが特徴的ですね。

この記事を書いた人
グッドネイバー

“ Webに悩むお客さまの「よき隣人」でありたい ” をモットーに、Web システム開発(主に Laravel)、Web マーケティング支援の仕事をしています。お仕事のご依頼・ご相談はこちらからお気軽にどうぞ。