見出し画像

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の記事

__________________________________

執筆者プロフィール: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/