MySQL - データ型
概要
MySQLのデータ型は、データの性質と用途に応じて適切に選択する必要がある。
効率的なデータベース設計のために、データの特性を理解して、最適なデータ型を選択することが重要である。
整数値を扱う場合、TINYINTからBIGINTまでの範囲から、データの大きさに応じて選択する。
例えば、年齢を格納する場合はTINYINT型で十分であるが、ユーザIDなどの連番には一般的にINT型やBIGINT型を使用する。
小数を扱う場合は、精度の要件に着目する。
金額計算等の高い精度が求められる場合はDECIMAL型を使用する。
一方、科学的な計算や精度よりも処理速度が重要な場合は、FLOAT / DOUBLE型が適している。
文字列データは、固定長あるいは可変長という特性で大きく分かれる。
パスワードのハッシュ値のように長さが決まっているデータにはCHAR型が適しているが、ユーザ名や住所などの可変長データにはVARCHAR型が適している。
また、大量のテキストデータを扱う場合、TEXT型のファミリー (TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT) から適切なものを選択する。
例えば、ブログの投稿内容等には一般的にTEXT型が使用される。
日付や時刻のデータは、用途に応じて適切な型を選択する。
単純な日付にはDATE型、時刻のみの場合はTIME型、両方必要な場合はDATETIME型を使用する。
また、タイムゾーンを考慮する必要がある場合は、TIMESTAMP型を使用する。
特殊なデータの取り扱いにおいて、限られた選択肢から値を選ぶ場合、ENUM型やSET型が有効である。
例えば、商品のサイズ (S、M、L) 等はENUM型で効率的に管理することができる。
最近のWebアプリケーション開発では、JSON型の活用が増えている。
柔軟なデータ構造を持つ情報を格納する場合に有効である。
画像やその他ファイル等のバイナリデータは、BLOB型のファミリーを使用して格納する。
ただし、大きなファイルはファイルシステムに保存して、データベースにはパスを格納する方法も一般的である。
空間データの取り扱いにおいて、地理的な情報を扱う必要がある場合、GEOMETRY型とその関連型を使用する。
これは、地図アプリケーションや位置情報サービスの開発で活用されている。
パフォーマンスとストレージの最適化を考慮する場合、データ型の選択は、データベースのパフォーマンスとストレージ効率に大きく影響する。
必要以上に大きなデータ型を選択すると、ストレージの無駄遣いになるだけでなく、検索やソートの性能にも影響を与える可能性がある。
文字列型は、適切な文字セットの選択も重要となる。
UTF-8であればutf8mb4を使用するのが一般的である。
これにより、絵文字を含むあらゆる文字を正しく扱うことができる。
したがって、MySQLのデータ型は、データの特性、用途、パフォーマンスの要件に応じて適切に選択することが重要となる。
※注意
各データ型を選択する場合において、以下に示す事柄を考慮すること。
- ストレージ効率
- 必要最小限のサイズを選択する。
- パフォーマンス
- 検索や演算の頻度を考慮する。
数値型
データの正確性において、数値型では、DECIMAL型とFLOAT / DOUBLE型の選択が重要となる。
整数型
- TINYINT
- -128〜127 (1バイト)
- UNSIGNED TINYINT
- 0〜255
- SMALLINT
- -32768〜32767 (2バイト)
- UNSIGNED SMALLINT
- 0〜65535
- MEDIUMINT
- -8388608〜8388607 (3バイト)
- UNSIGNED MEDIUMINT
- 0〜16777215
- INT / INTEGER
- -2147483648〜2147483647 (4バイト)
- UNSIGNED INT / UNSIGNED INTEGER
- 0〜4294967295
- BIGINT
- -9223372036854775808〜9223372036854775807 (8バイト)
- UNSIGNED BIGINT
- 0〜18446744073709551615
小数型
- DECIMAL(M,D) / NUMERIC(M,D)
- 正確な小数を扱う
- M
- 全体の桁数 (最大65)
- D
- 小数点以下の桁数
- FLOAT
- 単精度浮動小数点数 (4バイト)
- 精度は約7桁
- DOUBLE
- 倍精度浮動小数点数 (8バイト)
- 精度は約15桁
文字列型
文字列型では、適切な文字セットの選択が必要となる。
固定長
- CHAR(N)
- 固定長文字列 (最大255文字)
- 指定した長さより短い文字列は空白で埋められる。
可変長
- VARCHAR(N)
- 可変長文字列 (最大65535文字)
- 実際のデータ長だけを使用。
- ただし、実際の最大文字数は文字セットによって変わる。
- utf8mb4の場合
- 最大16383文字
- utf8の場合
- 最大21844文字
- TINYTEXT
- 最大255文字 (1バイト + データ長)
- TEXT
- 最大65535文字 (2バイト + データ長)
- MEDIUMTEXT
- 最大16777215文字 (3バイト + データ長)
- LONGTEXT
- 最大4294967295文字 (4バイト + データ長)
選択の目安
- VARCHAR:
- 最大長が予測できる場合
- 検索やソートが頻繁に必要な場合
- TEXT
- 最大長が不明または非常に長いテキストを扱う場合
- ブログの記事本文やドキュメントの内容等
-- TEXT型の使用例
CREATE TABLE articles (
id INT PRIMARY KEY,
content TEXT, -- 通常の長いテキスト
description MEDIUMTEXT, -- より長いテキスト
full_content LONGTEXT -- 非常に長いテキスト
);
-- VARCHAR型の使用例
CREATE TABLE messages (
id INT PRIMARY KEY,
message VARCHAR(10000) -- 最大10000文字まで
);
バイナリ型
- BINARY(N)
- 固定長バイナリ文字列
- VARBINARY(N)
- 可変長バイナリ文字列
- TINYBLOB
- 最大255バイト
- BLOB
- 最大65535バイト
- MEDIUMBLOB
- 最大16777215バイト
- LONGBLOB
- 最大4294967295バイト
日付・時間型
- DATE
- 日付 (YYYY-MM-DD形式)
- 範囲 : 1000-01-01 〜 9999-12-31
- TIME
- 時間 (HH:MM:SS形式)
- 範囲 : -838:59:59 〜 838:59:59
- DATETIME
- 日付と時間 (YYYY-MM-DD HH:MM:SS形式)
- 範囲 : 1000-01-01 00:00:00 〜 9999-12-31 23:59:59
- TIMESTAMP
- タイムスタンプ
- 範囲 : 1970-01-01 00:00:01 UTC 〜 2038-01-19 03:14:07 UTC
- YEAR
- 年 (4桁)
- 範囲 : 1901〜2155
-- 日時でソートする例
SELECT * FROM t_sample ORDER BY ctime DESC;
特殊型
- ENUM
- 列挙型
- 定義された値の中から1つだけ選択できる。
- 最大65535個の値を定義できる。
- SET
- 複数の値を選択可能な列挙型
- 最大64個の値を定義できる。
- JSON
- JSON形式のデータを格納できる。
- JSONデータの検索や操作が可能である。
空間データ型
- GEOMETRY
- あらゆる種類の空間データ
- POINT
- 座標点
- LINESTRING
- 線データ
- POLYGON
- 多角形データ
- MULTIPOINT
- 複数の点データ
- MULTILINESTRING
- 複数の線データ
- MULTIPOLYGON
- 複数の多角形データ
- GEOMETRYCOLLECTION
- 異なる種類の空間データの集合