9.MySQLで使えるデータ型

MySQLで使えるデータ型

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;
BOOL型のデータを挿入

日時

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型のデータを挿入

ちなみに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;
値がNULL

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;
NOT NULLに定義したのでエラー

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フィールドの値がデフォルト値として設定した 仮タイトル となっているのがわかります。

このエントリーをはてなブックマークに追加

コメントを残す

頂いたコメントは一読した後表示させて頂いております。
反映まで数日かかる場合もございますがご了承下さい。