データ型
DATETIME
、DATE
、TIMESTAMP
はそれぞれ関連しています。
このセクションでは、これらのデータ型の特徴を示すとともに、これらのデータ型の類似点と相違点について説明します。
DATETIME
型は、日付と時刻の両方の情報を含む値を必要とするときに使用します。MySQL
では、DATETIME
型の値の取り出しと表示は 'YYYY-MM-DD
HH:MM:SS'
形式で行われます。サポートしている範囲は
'1000-01-01 00:00:00'
〜
'9999-12-31 23:59:59'
です(``サポート''
範囲より前の値でも動作する場合がありますが、確実に動作するという保証はありません)。
DATE
型は、日付値のみ必要とし、時刻部分は必要でない場合に使用されます。MySQL
では、DATE
型の値の取り出しと表示は
'YYYY-MM-DD'
形式で行われます。サポートしている範囲は、'1000-01-01'
〜 '9999-12-31'
です。
TIMESTAMP
カラム型の特性と動作は、MySQL
のバージョンとサーバでの SQL
実行モードに応じて異なります。
MAXDB
モードでの実行時の TIMESTAMP
の動作
MySQL を MAXDB
モードで実行している場合、TIMESTAMP
は DATETIME
と同じように動作します。TIMESTAMP
カラムの自動更新(次の段落で説明)は行われません。MySQL
の MAXDB
モードでの実行は、バージョン 4.1.1
以降で可能です。See
項4.1.1. 「mysqld
コマンドラインオプション」。
MAXDB
モードで実行していないときの
TIMESTAMP
の動作
TIMESTAMP
カラム型では、INSERT
または
UPDATE
操作に対して現在の日付と時刻を自動的に指定することができます。TIMESTAMP
カラムが複数ある場合は、最初のカラムのみが自動で更新されます。
最初の TIMESTAMP
カラムの自動更新は、次のいずれかの条件で発生します。
INSERT
または LOAD DATA
INFILE
ステートメントで、カラムが明示的に指定されていない場合。
UPDATE
ステートメントおよびその他の何らかのカラム変更値でカラムが明示的に指定されていない場合(注意:
カラムにすでに設定されている値を設定しようとする
UPDATE
では、TIMESTAMP
カラムは更新されない。カラムに現在の値を設定しようとしても、MySQL
では、効率性を考慮して更新操作が無視される)。
TIMESTAMP
カラムに値
NULL
が明示的に設定された場合。
2 番目以降の TIMESTAMP
カラムにも、現在の日付と時刻を設定することができます。カラムに
NULL
または NOW()
を設定します。
TIMESTAMP
型のいずれかのカラムに現在の日付と時刻以外の値を設定するには、そのカラムに対して、必要な値を明示的に設定します。これは、最初の
TIMESTAMP
カラムについても同様です。この特性は、次に示すように、レコードの作成時に
TIMESTAMP
カラムに現在の日時を設定し、その後そのレコードの更新時には設定済の値を変更しないようにする場合などに役立ちます。
レコードの作成時に、MySQL によってカラムを設定する。 それにより、そのカラムが現在の日付と時刻に初期化される。
そのレコードの他のカラムに対して後続の更新を行ったときには、TIMESTAMP
カラムにそのカラムの現在の値を明示的に設定する。
とはいえ、DATETIME
カラムを使用してレコードの作成時に値を
NOW()
に初期化し、後続の更新時にはそのままにしておくというのも、手軽な方法です。
MAXDB
モードでの実行時の TIMESTAMP
の特性
MySQL を MAXDB
モードで実行している場合、TIMESTAMP
は DATETIME
とまったく変わりません。格納と表示には同じ形式が使用され、また値の範囲も同じです。MySQL
の MAXDB
モードでの実行は、バージョン 4.1.1
以降で可能です。 See
項4.1.1. 「mysqld
コマンドラインオプション」。
MAXDB
モードで実行していないときの、MySQL 4.1
以降での TIMESTAMP
の特性
MySQL 4.1.0 では、TIMESTAMP
カラムの格納および表示には、
DATETIME
カラムと同じ形式が使用されます。したがって、次の段落で説明している方法で狭くしたり、広げたりすることはできません。つまり、TIMESTAMP(2)
や TIMESTAMP(4)
などは使用できないことになります。それ以外の特性は、以前の
MySQL バージョンと同じです。
MySQL 4.1
より前のバージョンにおける
TIMESTAMP
の特性
TIMESTAMP
値は 1970 年の始まりから
2037
年の一定の時点までを範囲とし、時間分解能は
1 秒です。値は数値として表示されます。
MySQL で TIMESTAMP
型の値の取り出しと表示に使用される形式は、次の表に示すように、表示サイズによって異なります。最長の
TIMESTAMP
形式は 14
桁ですが、TIMESTAMP
型のカラムはもっと短い表示サイズで作成することもできます。
カラム型 | 表示形式 |
TIMESTAMP(14) |
YYYYMMDDHHMMSS |
TIMESTAMP(12) |
YYMMDDHHMMSS |
TIMESTAMP(10) |
YYMMDDHHMM |
TIMESTAMP(8) |
YYYYMMDD |
TIMESTAMP(6) |
YYMMDD |
TIMESTAMP(4) |
YYMM |
TIMESTAMP(2) |
YY |
TIMESTAMP
型のカラムでは、表示サイズにかかわらず、格納サイズはすべて同じです。最も一般的な表示サイズは
6、8、12、14
です。テーブルの作成時に任意の表示サイズを指定できますが、値
0 と 14 を超える値は強制的に 14
に設定されます。1 〜 13
の奇数値のサイズは強制的にすぐ上の偶数に設定されます。
注意: バージョン 4.1
以降、TIMESTAMP
は 'YYYY-MM-DD
HH:MM:SS'
形式の文字列として返されます。その他のタイムスタンプ長のサポートは中止されました。
DATETIME
、DATE
、TIMESTAMP
型の値は、以下の一連の共通形式のいずれかを使用して指定することができます。
'YYYY-MM-DD HH:MM:SS'
または
'YY-MM-DD HH:MM:SS'
形式の文字列として指定。``柔軟''
な構文が許容される ---
日付部分と時刻部分の区切り記号として、任意の句読文字を使用することができる。
たとえば、'98-12-31
11:30:45'
、'98.12.31
11+30+45'
、'98/12/31
11*30*45'
、'98@12@31
11^30^45'
はいずれも同じ。
'YYYY-MM-DD'
または
'YY-MM-DD'
形式の文字列として指定。 この場合も
``柔軟''
な構文が許容される。たとえば、'98-12-31'
、'98.12.31'
、'98/12/31'
、'98@12@31'
はいずれも同じ。
'YYYYMMDDHHMMSS'
または
'YYMMDDHHMMSS'
形式の、区切り記号のない文字列(日付として適切なもの)として指定。たとえば、'19970523091528'
と '970523091528'
は
'1997-05-23 09:15:28'
として解釈されるが、'971122129015'
は正しくないため(分の部分が不適切)、'0000-00-00
00:00:00'
になる。
'YYYYMMDD'
または
'YYMMDD'
形式の、区切り記号のない文字列(日付として適切なもの)として指定。たとえば、'19970523'
と '970523'
は
'1997-05-23'
として解釈される、'971332'
は正しくないため(月と日付の部分が不適切)、'0000-00-00'
になる。
YYYYMMDDHHMMSS
または
YYMMDDHHMMSS
形式の数値(日付として適切なもの)として指定。たとえば、19830905132800
と 830905132800
は
'1983-09-05 13:28:00'
として解釈される。
YYYYMMDD
または
YYMMDD
形式の数値(日付として適切なもの)として指定。たとえば、19830905
と 830905
は
'1983-09-05'
として解釈される。
DATETIME
、DATE
、または
TIMESTAMP
型のコンテキストで許容される値を返す、NOW()
や CURRENT_DATE
などの関数の結果として指定。
不適切な
DATETIME
、DATE
、TIMESTAMP
値は、それぞれの型の ``ゼロ''
値('0000-00-00
00:00:00'
、'0000-00-00'
、00000000000000
)に変換されます。
日付部分の区切り記号を含む文字列として値を指定する場合、10
より少ない月または日の値を 2
桁で指定する必要はありません。'1979-6-9'
は '1979-06-09'
と同じ意味になります。同様に、時刻部分の区切り記号を含む文字列として値を指定する場合、10
より少ない時、分、または秒の値を 2
桁で指定する必要はありません。'1979-10-30
1:2:3'
は '1979-10-30 01:02:03'
と同じです。
数値として指定する値は 6、8、12、14
のいずれかの桁数にします。数値を 8
桁または 14
桁の長さにすると、YYYYMMDD
または YYYYMMDDHHMMSS
形式であり、最初の 4
桁が年であると想定されます。数値を 6
桁または 12
桁の長さにすると、YYMMDD
または
YYMMDDHHMMSS
形式であり、最初の 2
桁が年であると想定されます。これら以外の長さの数値は、最も近い長さになるよう先頭にゼロが追加された数値として解釈されます。
区切りなしの文字列として指定した値は、その文字列の長さに基づいて解釈されます。文字列が
8 文字または 14 文字の場合、最初の 4
文字が年であると想定されます。それ以外の長さの文字列の場合、最初の
2
文字が年であると解釈されます。文字列は、それに含まれている各部分に対応して、左から右に、年、月、日、時、分、秒の値として解釈されます。したがって、6
文字より少ない文字列は使用できません。たとえば、1999
年 3 月を表わす値として '9903'
を指定すると、MySQL
では、テーブルに日付値として ``ゼロ''
が格納されます。これは、年と月の値が
99
と 03
として指定されていても日の部分がまったくないことから、正しい日付ではないためです。しかし、MySQL
3.23
以降では、欠落している月または日の部分を表わすゼロの値を明示的に指定することができます。たとえば、'990300'
と指定することで、'1999-03-00'
という日付値を格納することができます。
TIMESTAMP
カラムでは、正しい値は、表示サイズにかかわらず、その値が指定されたときの完全な精度で格納されます。このことは、暗黙的に次のことを意味します。
カラム型が TIMESTAMP(4)
または
TIMESTAMP(2)
の場合でも、必ず年、月、日を指定する必要がある。このすべてを指定しないと、値は正しい日付とはならず、0
が格納される。
ALTER TABLE
を使用して表示桁数の小さな
TIMESTAMP
カラムの桁数を広げると、それまで
``非表示''
になっていた情報が表示される。
同様に、TIMESTAMP
カラムを狭くしても、単に、値を表示したときに表示される情報が少なくなるだけで、情報自体が失われるわけではない。
TIMESTAMP
型の値は完全な精度で格納されるが、基盤の格納値に対して直接作用する関数は
UNIX_TIMESTAMP()
だけである。他の関数は、取り出され、形式設定された値に作用する。したがって、HOUR()
や SECOND()
などの関数は、形式設定された値に
TIMESTAMP
値の該当の部分が含まれていない場合、使用できない。たとえば、TIMESTAMP
カラムの HH
部分は、表示サイズが 10
以上でないと表示されないため、それより短い
TIMESTAMP
値に対して
HOUR()
操作を行っても、無意味な値しか得られない。
ある日付型の値を別の日付型のオブジェクトに割り当てることは、ある程度までは可能です。しかし、何らかの値の変化や情報の消失が起こる可能性があります。
DATE
型の値を
DATETIME
または
TIMESTAMP
型のオブジェクトに割り当てた場合、値に時刻情報が含まれていないため、結果の値の時刻部分は
'00:00:00'
に設定される。
DATETIME
または
TIMESTAMP
型の値を
DATE
型のオブジェクトに割り当てた場合、DATE
型には時刻情報が格納されないため、結果の値の時刻部分は削除される。
DATETIME
、DATE
、および
TIMESTAMP
型の値はいずれも、同じ形式セットで指定することができるが、値の範囲については、すべての型で同じであるわけではない。たとえば、TIMESTAMP
型の値は、1970
より前にしたり、2037
より後にすることはできない。したがって、'1968-01-01'
などの日付は、DATETIME
型や
DATE
型の値としては正しいが、TIMESTAMP
型の値としては正しくないため、このようなオブジェクトに割り当てると、値は
0
に変換される。
日付値を指定する際には、次の点に注意してください。
文字列として指定する値で許容される柔軟な形式は、まぎらわしいことがある。
たとえば、'10:11:12'
などの値は、‘:
’
区切り記号のせいで時刻値のように見えるが、日付のコンテキストで使用した場合は、年
'2010-11-12'
として解釈される。値
'10:45:15'
は、'45'
が正しい月ではないため、'0000-00-00'
に変換される。
MySQL サーバでは、日 00-31
、月
00-12
、年
1000-9999
の有効性に関する基本チェックのみ実行される。この範囲外の日付はすべて
0000-00-00
に戻される。
この場合、2002-04-31
のような誤った日付も格納可能であることに注意する。Web
アプリケーションでは、追加のチェックを行わずに、フォームからデータを格納できる。日付が有効なものかどうか確認するには、アプリケーションでチェックを行う必要がある。
2 桁で指定された年の値は、何世紀かわからないため、あいまいである。MySQL では、次の規則に基づいて、2 桁の年の値が解釈される。
範囲 00-69
の年の値は
2000-2069
に変換
範囲 70-99
の年の値は
1970-1999
に変換
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.