2038年問題と2069年問題と2156年問題
DATE型とDATETIME型は最大9999年まで格納できるので、長期の未来日時を格納する場合はこのデータ型を使います。TIMESTAMP型とYEAR型には格納できる日付の範囲に制限があるため注意が必要です。
-
2038年問題:MySQLのTIMESTAMP型では、1970年1月1日0時 (Unix epoch)からの経過時間を31ビットで表現しているため、2038年1月19日3時14分7秒以降の値を格納できない。
参照: http://ja.wikipedia.org/wiki/2038年問題 - 2069年問題:MySQLの関数などではYEAR型のデータを2桁または4桁で表現できるが、2桁で表現した場合、00-69の範囲の年の値は2000-2069に、70-99の範囲の年の値は1970-1999に変換される。
- 2156年問題:4桁で年を表現しても、YEAR型で格納できる範囲は1901-2155のため、2156年以降の値を格納できない。
文字列型
文字列型の特徴は文字コードCHARACTER SETおよび文字の照合順序COLLATIONを利用できることにあります。MySQLで利用できる日本語関連の文字コードは第2回を、文字の照合順序は第3回を参照してください。
格納するデータ型には、固定長と可変長があります。ただし、実際どのように格納されるかはストレージエンジンに依存します。MyISAMの場合には格納するデータに応じて固定長と可変長を選択することで各テーブルの行フォーマットが固定長か可変長かが決まりますが、InnoDBの場合にはすべて可変長として、MEMORYの場合にはすべて固定長となります(MEMORYは各TEXT型利用不可)。
CHAR型とVARCHARの場合には最大の文字数を明示的に指定できます。また各データ型には格納可能なサイズにそれぞれ上限があります。ここでのサイズはバイト単位となっており、文字コードによって格納できる文字数に違いが出ます。最大65,536バイト格納可能なTEXTの場合、1文字あたり1バイトのasciiでは65,536文字、1文字あたり2バイトのcp932では32,767文字、1文字あたり4バイトのutf8mb4では16,384文字となります(ここで書いている1文字あたりのバイト数は最大のサイズのため、1バイト文字が含まれる場合などはより多い文字が格納可能となります)。CHAR型とTINYTEXT型は最大サイズが765バイトですが、格納可能な文字数はどの文字コードの場合でも255バイトです。
データ型 | 最大サイズ |
CHAR | 1,020Byte |
VARCHAR | 65,533Byte |
TINYTEXT | 1,020Byte |
TEXT | 64KB |
MEDIUMTEXT | 16MB |
LONGTEXT | 4GB |