MySQLデータベース データ型

MySQLデータベースで扱えるデータ型について記載しています。MySQLのデータ型は大きく分けて、文字列型、数値型、日付時刻型、その他の型に分類できます。

対応バージョン:MySQL8.0

数値型

数値型は以下のような型に分類できます。真数値は常に正確な数値を扱えるデータ型、概数値は二進数の計算で誤差が発生することがある代わりに非常に大きな数字から細かい数字までを幅広く扱えるデータ型です。

  • 真数値:整数型
  • 真数値:固定少数点型
  • 概数値:浮動小数点型
分類型名バイト数桁幅備考定義例用途
整数型TINYINT1

-128~127

最大:

TINYINT
  • ON/OFFフラグ
SMALLINT2-32768~32767SMALLINT
  • 数量
MEDIUMINT3-8388608~8388607MEDIUMINT
  • 数量の合計
INTEGER4-2147483648~2147483647INTEGERはINTをシノニムに持つINTEGER
  • 数量の合計
BIGINT8-263~263-1BIGINT
  • 数量の合計
固定少数点型DECIMAL(P,S)65桁

pは精度、Sスケール(小数点以下の桁数)

  • P=全体の桁数
  • S=小数点以下の桁数

DECIMAL(5,2)

少数部が2桁の合計5桁

  • 単価
  • 小計
  • 合計
NUMERIC(P,S)

4.0:/4.1:P+2バイト

5.0:4.0/4.1の約半分

pは精度、Sスケール(小数点以下の桁数)

  • P=全体の桁数
  • S=小数点以下の桁数

NUMERIC(5,2)

少数部が2桁の合計5桁

  • 単価
  • 小計
  • 合計
浮動小数点型FLOAT(M,D)40~23の精度はFLOAT
  • M=合計桁数
  • D=少数点部桁数

24を超えた時に自動的にDOUBLE型になる

※8.0ではFLOAT(p)は動作しない。

※FLOAT(M,D)形式は将来的に非推奨となる予定

※オーバーフロー時はばっさり落とされる

FLOAT

FLOAT(25,23)

FLOAT(7,4)=-999.9999

  • 精度が不要な計算
  • 科学計算
  • 円周率
  • 弾道計算
DOUBLE(M,D)824~53の精度はDOUBLE
  • M=合計桁数
  • D=少数点部桁数

※8.0ではFLOAT(p)は動作しない。

DOUBLE

DOUBLE(26,24)

DOUBLE(7,4)=-999.9999

  • 精度が不要な計算
  • 科学計算
  • 円周率
  • 弾道計算
ビットBIT(M)約(M+7)/8バイト1~64値は0と1で書かれたバイナリ値

BIT(1~64まで設定可)

数値型として、NUMERIC/DECIMAL型があるが、これらは内部的にはすべて同じ型として扱われるためどれを使用してもよい。

CREATE TABLE サンプル

CREATE TABLE `testdb`.`sample_numer` (
  `id` INT NOT NULL,
  `sml_TINYINT` TINYINT NULL,
  `sml_SMALLINT` SMALLINT NULL,
  `sml_MEDIUMINT` MEDIUMINT NULL,
  `sml_INTEGER` INT NULL,
  `sml_BIGINT` BIGINT NULL,
  `sml_DECIMAL` DECIMAL(5,2) NULL,
  `sml_NUMERIC` NUMERIC(5,2) NULL,
  `sml_FLOAT` FLOAT(20,2) NULL,
  `sml_DOUBLE` DOUBLE(26,24) NULL,
  `sml_BIT` BIT(8) NULL,
  PRIMARY KEY (`id`));

検索結果

数値型検索結果

文字列型

文字列型には、固定長文字列型と可変長文字列型があります。

データ型

最大長備考定義例用途
文字型(固定長)CHAR(n)4.0:255バイト
4.1~:255文字
最大長を指定しなかった場合、CHAR(1)となる

CHAR(10)

CHAR(255)

  • 固定長データ
  • 旧ホスト系データ
  • ID(A001等)
  • 商品分類コード
  • 部門コード
文字型(可変長)VARCHAR(n)4.0:255バイト
4.1:255文字
5.0~:65532バイト

MySQL8.0=nの指定数は、4バイトunicodeであれば、

16200が限界である。

一般的にはVARCHAR(255)

VARCHAR(16000)
  • タイトル
  • メーカ名
  • 型番
  • ショートメモ
  • URL
  • 住所
  • 郵便番号
  • 商品分類コード
  • 部門コード
TINYTEXT255バイトUnicodeで220文字前後くらいTINYTEXT
  • 本文
  • 商品説明
  • 小説
TEXT64KBUnicodeで16000文字前後くらいTEXT
  • 本文
  • 商品説明
  • 小説
MEDIUMTEXT16MBUnicodeで250,000文字前後くらいMEDIUMTEXT
  • 本文
  • 商品説明
  • 小説
LONGTEXT4GBUnicodeで1,000,000,000文字前後くらいLONGTEXT
  • Webコンテンツ

※1KB = 1024バイト、1MB = 1024KB、 1GB = 1024MB

※可変長型の場合は、使用バイト数を特定するために、列ごとに1~4バイトの管理領域が別途使用される。

CREATE TABLE サンプル

CREATE TABLE `testdb`.`sample_string` (
  `id` INT NOT NULL,
  `sml_CHAR` CHAR(10) NULL,
  `sml_VARCHAR` VARCHAR(255) NULL,
  `sml_TINYTEXT` TINYTEXT NULL,
  `sml_TEXT` TEXT NULL,
  `sml_MEDIUMTEXT` MEDIUMTEXT NULL,
  `sml_LONGTEXT` LONGTEXT NULL,
  PRIMARY KEY (`id`));

検索結果

文字列型検索結果

CHAR および VARCHAR 型

  • 固定長文字列型:CHAR
  • 可変長文字列型:VARCHAR

固定長文字列型であるCHAR型は、そのカラムに入れる値が何文字であっても内部的にカラムに宣言されたサイズぶんの領域を使用します。可変長文字列型であるVARCHAR型は、カラムに宣言されたサイズを上限として値の文字数ぶんだけの領域を使用します。

MySQLでは、VARCHAR型の右側のスペースは指定されたとおりに保持されます(RDBMSによっては、これらのスペースが削除されてしまうものがあります)。なお、CHAR型でカラムに宣言したサイズの領域を使用するのはひょかんされた状態の話であり、取り出す際にはこれらのスペースは削除されます。このため、VARCHAR型と異なり、CHAR型では右側のスペースは情報として保持されません。

MySQLの文字列型は、ソートや文字列比較などにおいて、デフォルトでは半角英字の大文字/小文字を区別しない。test,Test,TESTの値が登録されていた場合、testで検索した場合すべて合致する

TEXT型

65,535バイト超える長い文字列を扱うための型です。扱える最大サイズに応じて、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXTがあります。長い文字列をBLOB型に格納しても構いませんが、その場合はたんなるバイナリ情報として格納され、ソートや比較で使われる照合順序を考慮しません。TEXT型では照合順序に対応します。TEXT型は標準SQLではない、MySQL独自の型です。

バイナリ型

バイナリ文字列を格納する点を除き、CHAR および VARCHAR と似ています。

データ型最大長備考定義例用途
バイナリ型(固定長)BINARY(M)255バイトMはカラムの長さをバイト単位で指定BINARY(255)
  • 画像保存
  • ファイル保存
  • 音声の保存
バイナリ型(可変長)VARBINARY(M)4.0/4.1:255バイト
5.0~:65532バイト
Mはカラムの長さをバイト単位で指定VARBINARY(16000)
  • 画像保存
  • ファイル保存
  • 音声の保存
TINYBLOB255 (28 − 1) バイトTINYBLOB
  • 画像保存
  • ファイル保存
  • 音声の保存
BLOB(M)65,535 (216 − 1) バイトMはカラムの長さをバイト単位で指定BLOB(255)
  • 画像保存
  • ファイル保存
  • 音声の保存
MEDIUMBLOB16,777,215 (224 − 1) バイトMEDIUMBLOB
  • 画像保存
  • ファイル保存
  • 音声の保存
LONGBLOB4,294,967,295 または 4G バイト (232 − 1) バイトLONGBLOB
  • 画像保存
  • ファイル保存
  • 音声の保存

BLOB型

大きなバイナリを扱うための型です。扱える最大サイズに応じて、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOBの型があります。BLOB型は標準SQLではない、MySQL独自の型です

CREATE TABLE サンプル

CREATE TABLE `testdb`.`sample_binary` (
  `id` INT NOT NULL,
  `sml_BINARY` BINARY(255) NULL,
  `sml_VARBINARY` VARBINARY(16000) NULL,
  `sml_TINYBLOB` TINYBLOB NULL,
  `sml_BLOB` BLOB(255) NULL,
  `sml_MEDIUMBLOB` MEDIUMBLOB NULL,
  `sml_LONGBLOB` LONGBLOB NULL,
  PRIMARY KEY (`id`));

検索結果

バイナリ型検索結果

日付時刻型

DATETIME型、TIMESTAMP型、TIME型は、秒の単位として少数第6位まで(マイクロ秒)を扱うことができます。

種類データ型有効範囲表示フォーマットバイト定義例用途
YEAR(4)1901~2155YYYY1バイト

YEAR(4)

YEAR

  • 年度
年月日DATE1000-01-01~9999-12-31YYYY-MM-DD3バイトDATE
  • 入荷日
  • 発売日
  • 登録日
時分秒TIME(f)

-838:59:59′ から

838:59:59′

hh:mm:ss3バイト+少数秒

TIME

TIME(0~6少数精度)

  • 登録時間
  • 発送時間
年月日時分秒DATETIME(f)

1970-01-01 00:00:01.000000から

2038-01-19 03:14:07.999999

YYYY-MM-DD hh:mm:ss[.fraction]5バイト+少数秒

DATETIME

DATETIME(0~6少数精度)

  • 登録日時
  • ログ
年月日時分秒TIMESTAMP(f)

1970-01-01 00:00:01.000000から

2038-01-19 03:14:07.999999

TIMESTAMP 値には、マイクロ秒 (6 桁) までの

精度で後続の小数秒部分を含めることができます。

YYYY-MM-DD hh:mm:ss[.fraction]4バイト+少数秒

TIMESTAMP

TIMESTAMP(0~6少数精度)

  • 登録日時
  • ログ

CREATE TABLE サンプル

CREATE TABLE `testdb`.`sample_date` (
  `id` INT NOT NULL,
  `sml_YEAR` YEAR(4) NULL,
  `sml_DATE` DATE NULL,
  `sml_TIME` TIME NULL,
  `sml_DATETIME` DATETIME NULL,
  `sml_TIMESTAMP` TIMESTAMP NULL,
  PRIMARY KEY (`id`));

検索結果

日付型検索結果

DATETIME型

日付と時刻を格納できます。サポートされているのは、「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の範囲です。

TIME型

時刻情報を格納できます。扱える範囲は「-838:59:59」から「838:59:59」の範囲です。

YEAR型

年の情報を格納できます。以前のバージョンではYEAR(4)、YEAR(2)などの桁数を指定して保存できましたが、MySQL8.0ではどちらも非推奨となり、単にYEARと指定する必要があります。

その他の型

データ型最大長定義例
ENUM(‘value1′,’value2’,…)65,535 個の個別の要素
個々のENUM要素でサポートされているのは、M <= 255 および (M x w) <= 1020。
M=長さ、w=文字セットの最大長文字に必要なバイト数
ENUM(‘apple’, ‘orange’, ‘cherry’)
SET(‘value1′,’value2’,…)64 個の個別のメンバー
個々のSET要素でサポートされているのは、M <= 255 および (M x w) <= 1020。
M=長さ、w=文字セットの最大長文字に必要なバイト数
SET(‘ONE’, ‘TWO’, ‘THREE’)

CREATE TABLE サンプル

CREATE TABLE `testdb`.`sample_enum_set_json` (
  `id` INT NOT NULL,
  `sml_enum` ENUM('tokyo', 'oosaka', 'nagoya') NULL,
  `sml_set` SET('tel', 'fax', 'mobile phone') NULL,
  `sml_json` JSON NULL,
  PRIMARY KEY (`id`));

検索結果

ENUM型、SET型、JSON型検索結果

ENUM型

列挙型です。あらかじめ複数の文字列を定義しておき、その中から1つを選択できるようにします。

SET型

列挙型です。あらかじめ複数の文字列を定義しておき、その中から複数を選択できるようにします。

JSON型

JSONデータを格納できます。単にJSONの文字列として格納さえるのではなく、解析され、内部的にバイナリとして格納されています。

空間データ型

MySQL には、OpenGIS クラスに対応する空間データ型があります。緯度、経度などの位置の情報を格納できます。

データ型意味特徴定義例
GEOMETRY点、線、面すべてを扱えるPOINT/LINESTRING/POLYGON型を扱える
POINT2つの軸(X軸、Y軸)の値を表す2つの数字からなるPOINT(3 5)
LINESTRING複数のPOINTを指定し、それらをつないだ線。必ずしも1つの直線というわけではなく、
3点以上を次々と結んだ型を表せる
LINESTRING(3 5,5 1,5 5,1 5,1 1)
POLYGON複数のPOINTを次々と結び、最後に始点に戻ってくるPOLYGON((1 1,5 1, 5 5, 1 5,1 1))
MULTIPOINT点の集合それぞれ集合を扱える
MULTILINESTRING線の集合それぞれ集合を扱える
MULTIPOLYGON面の集合それぞれ集合を扱える
GEOMETRYCOLLECTION点の集合、線の集合、面の集合をすべて扱えるPOINT/LINESTRING/POLYGON型のそれぞれの集合を扱える

参考資料

MySQL 8.0 リファレンスマニュアル

こちらのサイトで確認できます。