MySQL - データ型

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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
    異なる種類の空間データの集合