MySQLのデータ型

文字データ

MySQlでは、文字列、日付、数値のほか、XML/JSONや空間データといった特殊なデータ型もある。一般的には、文字列、日付(時間データ)、数値の集合体であるため、この3つに絞って
書き出してみる。

テキスト型  最大バイト数 
 char(固定長)  255
 varchar(可変長)  65,535
 tinytext(可変長)  255
 text(可変長)  65,535
 mediumtext(可変長)  16,777,215
 longtext(可変長)  4,294,967,295

上記となっている。固定長なのは、charのみで他は可変長となっている。固定長のデータ型は、指定したバイト数を固定で使うが、可変長は、データの長さによってバイト数が変動すること
から、charを使う意味は余りなくなっている。
<重要> varcharが64KB可変長なのでtext型を使う意味は無くなっている。WEBのフォームに記載すべき内容に関しては、ほぼvarchar型で十分だと思うが、ドキュメントなどの場合は、
midiumtext型かlongtext型を選択するのが良いかなと思います。

文字セット

英語模様にアルファベットを利用する場合は、文字1文字に付き1バイトで表現出来るが、日本語等の場合は、マルチバイト文字セットを使うことになる。UTF-8が代表的です。
MySQLでは、デフォルトでは、utf8mb4がデフォルトとなっていて、日本語文字列に対し、デフォで対応している。
以下は、MySQLで利用できる文字セットとなるが、基本デフォのutf8mb4で問題ないと思っている。
mysql> show character set;


数値データ

数値の関しては、様々にあるが、falseの0やtrueの1やテーブルに対してシステムが生成する主キー(大抵1ずつ増えていく)、対応履歴などの対応IDなどとなる。
以下に代表的な数値の型を記載する。
※unsignedは、プログラミングでは、特にデータ型について言及する際に使われる用語です。例えば「unsigned int」と言うと、符号なし整数(負の値を持たない整数)を指す。
これは、数値の格納範囲を負の方向に広げる代わりに正の方向へ全体を振り分ける仕様になっています。たとえば、通常の int 型が -32,768 から 32,767 までの範囲を持つ場合、
unsigned int 型では 0 から 65,535 までの範囲になります。

整数型  signedの範囲  unsignedの範囲 
 tinyint  -128~127 0~255 
 smallint  -32,768~32,767 0~65,535
 mediumint  -8,388,608~8,388,607 0~16,777,215 
 int  -2,147,483,648~2,147,483,647 0~4,294,967,295
 bigint  -2の63乗~2の63乗-1 0~2の64乗-1

上記の整数型を利用してtinyintの1バイトからbigintの8バイトまでデータを格納するのに問題ない。また、想定される最大数値の内、念のため大きなデータ数値型にしても、ストレージ領域
が、無駄になることはないので、ちょっと大き目かなの感じで型を指定してOKだと思います。

浮動小数点型  数値の範囲 
 float(p,s) 約-1.17549 × 10^-38~-3.40282 × 10^38
 double(p,s) 約-2.22507 × 10^-308~-1.79769 × 10^308

上記が浮動小数点の範囲となる。浮動小数点を使うときには、精度(小数点の左右の桁数の合計)および位取り(小数点以下の桁数)を指定できる。(p,s)必ず指定しないと
いけないわけではないです。
精度と位取りを指定した場合は、指定された精度、位取りを超えるデータを格納すると、データは丸められる事は、覚えておきたいです!
float(4,2)とした場合、27.44や11.08とかは大丈夫だが、17.8695の様な数値だと丸められ17.87のようになる。float(4,2)に178.375の数値を格納すればエラーになる。
概ね浮動小数点は、floatで問題ないと思った。

時間データ

文字列、数値のほか、時間データはほぼ使う項目となります。

時間型  デフォルトフォーマット  有効な値 
 date  YYYY-MM-DD  1000-01-01~9999-12-31
 datetime  YYYY-MM-DD HH:MI:SS  1000-01-01 00:00:00.000000~9999-12-31 23:59:59.999999
 timestamp  YYYY-MM-DD HH:MI:SS  1970-01-01 00:00:00.000000~2038-01-18 22:17:07.999999
 year  YYYY  1901~2155
 time  HHH:MI:SS  -838:59:59.000000~838:59:59.000000


概ね必要なデータ型を記載したが、このほかにもXMLやJSONなども扱える。時間あれば追記する。