MySQLのDDLの基本について理解する
はじめに
こんにちは、SHIFT の開発部門に所属しているKatayamaです。今期から転属になり、開発を担当していくことになりました。
現在、基本的な事から学ぶ研修中です。開発部門では新しく学ぶことがたくさんあり、それらを自身の振り返りアウトプットとして発信していけたらと思います。記事が溜まったら、noteのマガジンにもまとめる予定です。
DBについてはバックエンドの設計をきちんとしたことがなかった(すでに定義済みのスキーマに沿って分かった気になってSQLを書くぐらい)のできちんと理解した事をアウトプットしておこうと思います。
DDL
unsigned
負数が使えなくなる代わりにその分扱える正の値を増やす設定をする構文
ex) TINYINT型では通常扱える範囲は-128~127だが、unsignedを定義する事で0~255になる
・参考:11.1.1 Numeric Data Type Syntax
CHARACTER SET utf8mb4("utf8mb4"の部分は可変)
文字コードを設定する構文
ex) `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
※下記で出てくるテーブルの文字コード設定ができる "DEFAULT CHARSET=utf8mb4" を設定していれば各カラムでの設定は不要になる
設定の適用順位は、column > table > dbの順番。
・参考:10.3.4 Table Character Set and Collation
ENGINE=InnoDB
MySQLでは複数のストレージエンジンをサポートされているので、どのストレージエンジンを使うのか?の設定をする構文(デフォルトではInnoDB)
ex) 下記のDDL全体を参照
・参考:Chapter 14 The InnoDB Storage Engine
・参考:デフォルトストレージエンジンに関する設定を記述する
DEFAULT CHARSET=utf8mb4
テーブルの文字コードのデフォルトを設定する構文(テーブル全体で設定するので各カラムで "CHARACTER SET utf8mb4" のように書く必要がなくなる)
ex) 下記のDDL全体を参照
COLLATE utf8mb4_unicode_ci("utf8mb4_unicode_ci"の部分は可変)
文字列の比較やソート順のルールを設定できる構文(日本語で言うと照合順序)
ex) `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
・参考:10.3.4 Table Character Set and Collation
・参考:MySQLの文字コードとCollation
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
デフォルト値を現在のタイムスタンプに設定する構文
※DEFAULT CURRENT_TIMESTAMPだけだと、現在のタイムスタンプに自動的に更新されないので注意
・参考:11.2.6 Automatic Initialization and Updating for TIMESTAMP and DATETIME
おまけ utf8mb4とは?
そもそも文字コード(文字エンコーディング)として、JISコード・Shift JISコード・日本語EUC(EUC-JP)・UTF-8など色々あるが、その中でもUTF-8はインターネット(WWW)の世界では最も一般的なものとして存在している。
そしてUTF-8は1~4バイトで、バイトと文字を対応付ける仕組み。
なのになぜかMySQLのutf8は1~3バイトしか保存できない型として定義されており、絵文字などを入れられないという仕様になっている。そこでちゃんと世界の基準にあっているutf8mb4(1~4バイトまで格納可能な型)が存在しており、基本的にはこれをカラムの型に指定する。
・参考:utf8とutf8mb4の違い【MySQL】
・参考:UTF-8
上記の理解をするために参照していたDDL
CREATE TABLE `todos` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`is_complete` tinyint(1) DEFAULT '0',
`assagin_person` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
まとめとして
MySQLのDDL(テーブル定義)で出てきているキーワードについて、それらが何を意味しているのか?の理解が深まった。ただ、まだまだ理解するべき事はたくさんあると思うので、今後さらに理解を深めていきたい。
__________________________________
執筆者プロフィール:Katayama Yuta
SaaS ERPパッケージベンダーにて開発を2年経験。 SHIFTでは、GUIテストの自動化やUnitテストの実装などテスト関係の案件に従事したり、DevOpsの一環でCICD導入支援をする案件にも従事。 最近開発部門へ異動し、再び開発エンジニアに。座学で読み物を読むより、色々手を動かして試したり学んだりするのが好きなタイプ。
お問合せはお気軽に
https://service.shiftinc.jp/contact/
SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/
SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/
SHIFTの導入事例
https://service.shiftinc.jp/case/
お役立ち資料はこちら
https://service.shiftinc.jp/resources/
SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/