MySQLデータベース データ型
MySQLデータベースで扱えるデータ型について記載しています。MySQLのデータ型は大きく分けて、文字列型、数値型、日付時刻型、その他の型に分類できます。
対応バージョン:MySQL8.0
数値型
数値型は以下のような型に分類できます。真数値は常に正確な数値を扱えるデータ型、概数値は二進数の計算で誤差が発生することがある代わりに非常に大きな数字から細かい数字までを幅広く扱えるデータ型です。
- 真数値:整数型
- 真数値:固定少数点型
- 概数値:浮動小数点型
分類 | 型名 | バイト数 | 桁幅 | 備考 | 定義例 | 用途 |
---|---|---|---|---|---|---|
整数型 | TINYINT | 1 | -128~127 最大: | TINYINT |
| |
SMALLINT | 2 | -32768~32767 | SMALLINT |
| ||
MEDIUMINT | 3 | -8388608~8388607 | MEDIUMINT |
| ||
INTEGER | 4 | -2147483648~2147483647 | INTEGERはINTをシノニムに持つ | INTEGER |
| |
BIGINT | 8 | -263~263-1 | BIGINT |
| ||
固定少数点型 | DECIMAL(P,S) | 65桁 | pは精度、Sスケール(小数点以下の桁数)
| DECIMAL(5,2) 少数部が2桁の合計5桁 |
| |
NUMERIC(P,S) | 4.0:/4.1:P+2バイト 5.0:4.0/4.1の約半分 | pは精度、Sスケール(小数点以下の桁数)
| NUMERIC(5,2) 少数部が2桁の合計5桁 |
| ||
浮動小数点型 | FLOAT(M,D) | 4 | 0~23の精度はFLOAT |
24を超えた時に自動的にDOUBLE型になる ※8.0ではFLOAT(p)は動作しない。 ※FLOAT(M,D)形式は将来的に非推奨となる予定 ※オーバーフロー時はばっさり落とされる | FLOAT FLOAT(25,23) FLOAT(7,4)=-999.9999 |
|
DOUBLE(M,D) | 8 | 24~53の精度はDOUBLE |
※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) |
|
文字型(可変長) | VARCHAR(n) | 4.0:255バイト 4.1:255文字 5.0~:65532バイト | MySQL8.0=nの指定数は、4バイトunicodeであれば、 16200が限界である。 一般的にはVARCHAR(255) | VARCHAR(16000) |
|
TINYTEXT | 255バイト | Unicodeで220文字前後くらい | TINYTEXT |
| |
TEXT | 64KB | Unicodeで16000文字前後くらい | TEXT |
| |
MEDIUMTEXT | 16MB | Unicodeで250,000文字前後くらい | MEDIUMTEXT |
| |
LONGTEXT | 4GB | Unicodeで1,000,000,000文字前後くらい | LONGTEXT |
|
※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) |
|
TINYBLOB | 255 (28 − 1) バイト | TINYBLOB |
| ||
BLOB(M) | 65,535 (216 − 1) バイト | Mはカラムの長さをバイト単位で指定 | BLOB(255) |
| |
MEDIUMBLOB | 16,777,215 (224 − 1) バイト | MEDIUMBLOB |
| ||
LONGBLOB | 4,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~2155 | YYYY | 1バイト | YEAR(4) YEAR |
|
年月日 | DATE | 1000-01-01~9999-12-31 | YYYY-MM-DD | 3バイト | DATE |
|
時分秒 | TIME(f) | -838:59:59′ から 838:59:59′ | hh:mm:ss | 3バイト+少数秒 | 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型
列挙型です。あらかじめ複数の文字列を定義しておき、その中から1つを選択できるようにします。
SET型
列挙型です。あらかじめ複数の文字列を定義しておき、その中から複数を選択できるようにします。
JSON型
JSONデータを格納できます。単にJSONの文字列として格納さえるのではなく、解析され、内部的にバイナリとして格納されています。
空間データ型
MySQL には、OpenGIS クラスに対応する空間データ型があります。緯度、経度などの位置の情報を格納できます。
データ型 | 意味 | 特徴 | 定義例 |
---|---|---|---|
GEOMETRY | 点、線、面すべてを扱える | POINT/LINESTRING/POLYGON型を扱える | |
POINT | 点 | 2つの軸(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 リファレンスマニュアル
こちらのサイトで確認できます。