MySQLで使えるデータ型について解説します。データ型はデータベースにおいて非常に重要なものですのでしっかりと把握しておきましょう。もしかするとそのエラーは型への理解度不足が原因かもしれません。
目次
整数
整数を扱うデータ型には次のものが用意されています。
TINYINT | -128 ~ +127 |
INT | -21億 ~ +21億 |
BIGINT | -922京 ~ +922京 |
整数はこれらの型によってそれぞれ扱える数値の幅が異なります。
ただ、幅を見て頂ければわかるとおり、特別な事情がない限り INT型を使うことになるでしょう。
また、マイナスの値を扱う必要がなければ
データ型 UNSIGNED
と、UNSIGNEDキーワードを付けてあげることによって正の数だけを扱えるようになります。
TINYINT UNSIGNED | 0 ~ 255 |
INT UNSIGNED | 0 ~ 42億 |
BIGINT UNSIGNED | 0 ~ 1844京 |
例えば次のSQL文はdata_typesという名前のテーブルを作成し、seisuuカラムにINT型、UNSIGNEDキーワードを付けたものを指定しています。
-- data_typesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS data_types; -- data_typesという名前のテーブルを作成 CREATE TABLE data_types ( seisuu INT UNSIGNED -- seisuuカラムにINT型、UNSIGNEDキーワードを付けたものを指定 ); -- レコードを挿入 INSERT INTO data_types (seisuu) VALUES (1), (200); -- data_typesテーブルのレコード一覧を取得 SELECT * FROM data_types;
このように指定したデータ型と一致した型の値は問題なく挿入できます。
ではここに文字列を挿入しようとするとどうなるでしょうか。実際にやってみましょう。
2行目の200という整数の代わりにtextという文字列を挿入してみます。
-- data_typesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS data_types; -- data_typesという名前のテーブルを作成 CREATE TABLE data_types ( seisuu INT UNSIGNED -- seisuuカラムにINT型、UNSIGNEDキーワードを付けたものを指定 ); -- レコードを挿入 INSERT INTO data_types (seisuu) VALUES (1), ("text"); -- data_typesテーブルのレコード一覧を取得 SELECT * FROM data_types;
Incorrect integer value 不正な整数値、とエラーが返ってきました。
このように指定したデータ型と異なる型のデータはエラーとなって弾いてくれます。
では、他のデータ型も見ていきましょう。
実数
DECIMAL | 固定小数点 |
FLOAT | 浮動小数点 |
DOUBLE | 浮動小数点(高精度) |
小数点を含む実数にはこれらの型があります。浮動小数点は細かいところで誤差が出てくる数値なので特に事情がない限りはDECIMALを使うことになるでしょう。
-- data_typesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS data_types; -- data_typesという名前のテーブルを作成 CREATE TABLE data_types ( seisuu INT UNSIGNED, -- seisuuカラムにINT型、UNSIGNEDキーワードを付けたものを指定 jissuu DECIMAL(4, 2) -- jissuuカラムにDECIMAL型、全4ケタ、小数点以下は2ケタを指定 ); -- レコードを挿入 INSERT INTO data_types (seisuu, jissuu) VALUES (1, 22.87), (200, 55.43); -- data_typesテーブルのレコード一覧を取得 SELECT * FROM data_types;
文字列
CHAR | 0 ~ 255文字 |
VARCHAR | 0 ~ 65535文字 |
TEXT | それ以上 |
ENUM | 特定の文字列から1つ |
SET | 特定の文字列から複数 |
文字列にはこれらの型があります。
IDなど短い固定長のデータにはCAHR、Web記事の文章など文字数がバラバラになるようなデータにはVARCHAR、VARCHARで収まらない文字数にはTEXT、といった使い分けです。
-- data_typesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS data_types; -- data_typesという名前のテーブルを作成 CREATE TABLE data_types ( seisuu INT UNSIGNED, -- seisuuカラムにINT型、UNSIGNEDキーワードを付けたものを指定 jissuu DECIMAL(4, 2), -- jissuuカラムにDECIMAL型、全4ケタ、小数点以下は2ケタを指定 moji VARCHAR(50), -- mojiカラムにVARCHAR型、最大50文字を指定 tokutei ENUM("Python", "PHP", "Ruby") -- tokuteiカラムにENUM型、Python,PHP,Rubyのいずれかのみ格納できるように ); -- レコードを挿入 INSERT INTO data_types (seisuu, jissuu, moji, tokutei) VALUES (1, 22.87, "test", "Python"), (200, 55.43, "aiueo", "PHP"); -- data_typesテーブルのレコード一覧を取得 SELECT * FROM data_types;
真偽値
BOOL | TRUE / FALSE |
真偽値はTRUE(真)かFALSE(偽)のどちらかを保持することができます。
ただし内部的にはTRUEが1、FALSEが0の1ケタのTINYINT型として保持されています。
真/偽、ON/OFF、OK/NG、といった2択の値を保持する時に使いましょう。
-- data_typesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS data_types; -- data_typesという名前のテーブルを作成 CREATE TABLE data_types ( seisuu INT UNSIGNED, -- seisuuカラムにINT型、UNSIGNEDキーワードを付けたものを指定 jissuu DECIMAL(4, 2), -- jissuuカラムにDECIMAL型、全4ケタ、小数点以下は2ケタを指定 moji VARCHAR(50), -- mojiカラムにVARCHAR型、最大50文字を指定 tokutei ENUM("Python", "PHP", "Ruby"), -- tokuteiカラムにENUM型、Python,PHP,Rubyのいずれかのみ格納できるように singi BOOL -- singiカラムにBOOL型を指定 ); -- レコードを挿入 INSERT INTO data_types (seisuu, jissuu, moji, tokutei, singi) VALUES (1, 22.87, "test", "Python", TRUE), (200, 55.43, "aiueo", "PHP", FALSE); -- data_typesテーブルのレコード一覧を取得 SELECT * FROM data_types;
日時
DATE | 日付 |
TIME | 時間 |
DATETIME | 日時 |
日時を扱う型にはこれらが用意されています。
-- data_typesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS data_types; -- data_typesという名前のテーブルを作成 CREATE TABLE data_types ( seisuu INT UNSIGNED, -- seisuuカラムにINT型、UNSIGNEDキーワードを付けたものを指定 jissuu DECIMAL(4, 2), -- jissuuカラムにDECIMAL型、全4ケタ、小数点以下は2ケタを指定 moji VARCHAR(50), -- mojiカラムにVARCHAR型、最大50文字を指定 tokutei ENUM("Python", "PHP", "Ruby"), -- tokuteiカラムにENUM型、Python,PHP,Rubyのいずれかのみ格納できるように singi BOOL, -- singiカラムにBOOL型を指定 nichiji DATETIME -- nichijiカラムにDATETIME型を指定 ); -- レコードを挿入 INSERT INTO data_types (seisuu, jissuu, moji, tokutei, singi, nichiji) VALUES (1, 22.87, "test", "Python", TRUE, "2022-10-07 14:09:08"), (200, 55.43, "aiueo", "PHP", FALSE, "2022-10-07"); -- data_typesテーブルのレコード一覧を取得 SELECT * FROM data_types;
ちなみにDATETIME型で日付のみを指定した場合は自動的にその日の00:00:00が時間として格納されます。
この記事で紹介した以外にもMySQLが扱えるデータ型はありますが、特によく使われるものはこれらです。
NULL
NULLとは『何もない』という意味の特殊な値です。
『何もない』というのは「空の文字列」や「0」という意味ではなく、文字通り値が『何もない』という意味です。データを扱ううえでこの違いは重要なので覚えておきましょう。
カラムに値が設定されていない場合、そのフィールドは NULL となっています。
実際に一部のカラムに値を設定せずにレコードを挿入してみましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( author_id INT, post_title VARCHAR(50) ); -- レコードを挿入 INSERT INTO titles (author_id, post_title) VALUES (1, 'MySQLとは'), (2, 'SQLとはなにか'); -- author_idカラムだけを指定してレコードを挿入 INSERT INTO titles (author_id) VALUES (1); SELECT * FROM titles;
3つ目のレコードのpost_titleフィールドの値が NULL となっているのがわかります。
値が設定されていなかったらエラーで弾きたい場合は、カラムを定義する際に NOT NULL を付けてあげましょう。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( author_id INT, post_title VARCHAR(50) NOT NULL ); -- レコードを挿入 INSERT INTO titles (author_id, post_title) VALUES (1, 'MySQLとは'), (2, 'SQLとはなにか'); -- author_idカラムだけを指定してレコードを挿入 INSERT INTO titles (author_id) VALUES (1); SELECT * FROM titles;
post_titleカラムには NULL を入れられないよう定義したので、エラーが返ってきます。
また、カラムにデフォルト値を設定してあげると、値が設定されていない時はエラーで弾くのではなくデフォルト値を格納してくれます。
-- titlesという名前のテーブルがあれば削除 DROP TABLE IF EXISTS titles; -- titlesという名前のテーブルを作成 CREATE TABLE titles ( author_id INT, post_title VARCHAR(50) DEFAULT "仮タイトル" ); -- レコードを挿入 INSERT INTO titles (author_id, post_title) VALUES (1, 'MySQLとは'), (2, 'SQLとはなにか'); -- author_idカラムだけを指定してレコードを挿入 INSERT INTO titles (author_id) VALUES (1); SELECT * FROM titles;
3つ目のレコードのpost_titleフィールドの値がデフォルト値として設定した 仮タイトル となっているのがわかります。