MySQLを使用しているとよく耳にするデータ型。このデータ型について、しっかりと理解しているでしょうか?あまり理解していないということであれば、MySQLを使ってデータベースの運用を行う上で、思わぬところでエラーが発生したり、うまくデータが保存されなかったりする可能性があります。ただ、MySQLのデータ型には複数の種類があるため、最初のうちはデータ型をややこしく感じてしまうかもしれません。
そこで本コラムでは、MySQLのデータ型について、できるだけ丁寧かつ分かりやすく解説をしていきます。
- MySQL データ型の概要
- MySQL データ型の種類
MySQLのデータ型とは?
これまでMySQLのデータ型についてあまり意識をしたことがないという方に向けて、簡単にデータ型を理解できるように説明をしていきます。
まず前提として、MySQLではデータベース上にテーブルを作成する際、各カラムに対して、登録するデータの種類(型)を指定することが推奨されています。たとえば、数字のデータであれば数値型、文字のデータなら文字列型といったように分類されるのです。
MySQL データ型の大きな分類
- 数値型
- 日付と時間型
- 文字列型
- 空間型
MySQL データ型のメリット
では、なぜMySQLではデータベース上にテーブルを作成する際、各カラムに対して、登録するデータの型を指定することが推奨されているのでしょうか。一言で言うとストレージを最適化するためです。後ほどデータ型の各種類について詳しく述べますが、以下に簡単な一例を挙げましょう。
たとえば、テーブルに1から60,000までの整数をランダムで登録するテーブルカラムがあるとしましょう。それに対して、適切なデータ型は以下のどれでしょうか。
- 「0〜255」の範囲の数値を登録できるTINYINT UNSIGNED型
- 「0〜65,535」の範囲の数値を登録できるSMALLINT UNSIGNED型
- 「0〜1,677,7215」の範囲の数値を登録できるMEDIUMINT UNSIGNED型
- 「0〜4,294,967,295」の範囲の数値を登録できるINT UNSIGNED型
- 「0〜18,446,744,073,709,551,615」の範囲の数値を登録できるBIGINT UNSIGNED型
上記5種類は、数値型をさらに細分化したデータ型の名称です。「1〜60,000」の数値であれば、TINYINT型以外のデータ型で対応できそうです。しかし、あえて無駄のない1つのデータ型を選ぶとすればSMALLINT UNSIGNED型ですね。
ほかの数値型となると、登録される数値に対してあまりにも対応範囲が広すぎるのです。必要以上に大きなデータ型を選択してしまうと、使用するストレージの容量が多くなり過ぎてしまいます。そのため、データ型を選択する際には、常に最適なものを選ぶことが推奨されています。
MySQL データ型の種類
それでは早速、MySQL データ型の種類について詳しく見ていくことにしましょう。
数値型
まずは先ほども例で触れた数値型について述べましょう。数値数値型からは、以下のものを紹介しましょう。
- 整数型
- 固定小数点型
整数型
整数型はその名前のとおり、SQL標準整数型に対応しています。以下がその一覧と範囲です。
- TINYINT(UNSIGNED)→ -128〜127(0〜255)
- SMALLINT(UNSIGNED)→ -32768 32767(0〜65535)
- MEDIUMINT(UNSIGNED)→ -8388608〜8388607(0 〜16777215)
- INT(UNSIGNED)→ -2147483648〜2147483647(0〜4294967295)
- BIGINT(UNSIGNED)→ -9223372036854775808〜9223372036854775807(0〜18446744073709551615)
固定小数点型
固定小数点型は、小数点の入る数値に対応しているデータ型です。以下がその一覧と範囲です。
- DECIMAL→ -999.99〜999.99
- NUMERIC→ -999.99〜999.99
データ型は2つありますが、MySQLの場合、NUMERICはDECIMALとして扱われます。そのため、固定小数点型を扱う際にはDECIMAL型を使いましょう。
日付と時間型
次に日付と時間型について述べましょう。日付と時間型には以下のものがあります。
- DATE型 /DATETIME型 / TIMESTAMP型
- TIME型
- YEAR型
こちらでは「DATE型 /DATETIME型 / TIMESTAMP型」についてまとめてご紹介をしていきましょう。
DATE型 /DATETIME型 / TIMESTAMP型
DATE型・DATETIME型・TIMESTAMP型はそれぞれ異なる型ですが、それぞれが関連し合っているため、まとめて見ていきましょう。
- DATE型→ 「YYYY-MM-DD」の形式でデータを取得・表示
- DATETIME型→ 「YYYY-MM-DD HH:MM:SS」の形式でデータを取得・表示
- TIMESTAMP型→ DAYETIME型の形式で日付データを取得・表示
DATE型とDATETIME型の違いは、時刻をデータに含めるかどうかの違いです。また、TIMESTAMP型は現在時刻などを取得するのに使用されることが多く、たとえばテーブルカラムのレコードに新しいデータを保管した日時を保存するときなどに用いられます。
ちなみにDATE型で取得・表示できる日時は「1000-01-01〜9999-12-31」の範囲、DATETIME型で取得・表示できる日時は「1000-01-01 00:00:00〜9999-12-31 23:59:59」の範囲であるということも覚えておきましょう。
文字列型
次に文字列型について述べましょう。文字列型には以下のものがあります。
- CHAR型 / VARCHAR型
- BINARY型 / VARBINARY型
- BLOB型 / TEXT型
- ENUM型
- SET型
こちらでは「CHAR型 / VARCHAR型」についてまとめてご紹介をしていきましょう。
CHAR型 / VARCHAR型
CHAR型とVARCHAR型は似ていますが、以下のような違いがあります。
- サポートしている文字数は「0〜255」文字
- 「固定長文字列」なので指定した文字数分だけ容量が確保される
- サポートしている文字数は「0〜65,535」文字
- 「可変長文字列」なのでデータの分だけの容量が確保される
2つのデータ型のポイントは固定長文字列と可変長文字列です。CHAR型の場合にはたとえば「50文字」分の字数を指定しておくと実際に入った文字が5文字であっても残り45文字分の容量を使用することとなります。一方VARCHARの場合には、実際に入った文字数分だけの容量が確保されることとなります。
まとめ
本コラムではMySQLのデータ型について、できるだけ丁寧かつ分かりやすく解説をしていきました。これまでデータ型についてあまり深く考えていなかったという方は、今回のコラムをきっかけに、適切なデータ型指定ができるようになったことかと思います。ぜひ、正しいデータ型を指定し、ストレージの最適化を常に意識していきましょう。
「UNSIGNED」というキーワードについても触れておきましょう。これは「記号なし」という意味です。たとえば負の数を表す「-(マイナス)」などは記号となります。「UNSIGNED」を数値型に指定すると、このような記号をつけることができない代わりに、数値の範囲を広めることができます。
たとえば「TINYINT UNSIGNED」は範囲が「0〜255」ですが、「TINYINT」は範囲が「-128〜127」となります。「UNSIGNED」をつけるかどうかは、テーブルカラムに登録されるデータに基づいて決めましょう。