Laravel のマイグレーション時に指定したカラムタイプで実際に作成されるカラムのデータ型を調べてみた
Laravel では、マイグレーション時にカラムタイプを指定することで RDBMS の違いを意識せずにカラムを作成することができますが、実際に作成されるカラムのデータ型は、当然のことながら、各 RDBMS に存在するものとなります。そこで、Laravel のカラムタイプと実際に作成されるデータ型を確認してみることにします。
カラムタイプと作成されるデータ型の対応については、Illuminate\Database\Schema\Grammars 以下に RDBMS ごとのクラス(MySqlGrammar など)が置かれています。この記事ではバージョン6系について、MySQL、PostgreSQL、SQLite、SQL Server の4つの RDBMS における実装を確認します。
| カラムタイプ | MySQL | PostgreSQL | SQLite | SQL Server |
|---|---|---|---|---|
| bigInteger | bigint | bigint | integer | bigint |
| binary | blob | bytea | blob | varbinary(max) |
| boolean | tinyint(1) | boolean | tinyint(1) | bit |
| char | char | char | varchar | nchar |
| date | date | date | date | date |
| dateTime | datetime | timestamp | datetime | datetime または datetime2 |
| decimal | decimal | decimal | numeric | decimal |
| double | double | double precision | float | float |
| enum | enum | varchar(255) check (“カラム名" in (“値1", “値2", …) | varchar check (“カラム名" in (“値1", “値2", …) | nvarchar(255) check (“カラム名" in ( “値1", “値2", … )) |
| float | double | double precision | float | float |
| integer | int | integer | integer | int |
| ipAddress | varchar(45) | inet | varchar | nvarchar(45) |
| json | json | json | text | nvarchar(max) |
| longText | longtext | text | text | nvarchar(max) |
| mediumInteger | mediumint | integer | integer | int |
| mediumText | mediumtext | text | text | nvarchar(max) |
| smallInteger | smallint | smallint | integer | smallint |
| string | varchar | varchar | varchar | nvarchar |
| text | text | text | text | nvarchar(max) |
| time | time | time | time | time |
| timestamp | timestamp | timestamp | datetime | datetime または datetime2 |
| tinyInteger | tinyint | smallint | integer | tinyint |
| year | year | integer | integer | int |
各 RDBMS の考え方のようなものも見えて、面白い調査結果となりました。特に SQL Server は、Unicode の文字列を扱うために nvarchar を使うのが特徴的ですね。




ディスカッション
コメント一覧
まだ、コメントがありません