MySQLサーバ自体は2000年(Y2K)コンプライアンスに対して何も問題はありません。
MySQLサーバは、TIMESTAMP
値に対して、日付を 2037
年まで扱う
Unix時間関数を利用しています。DATE
と DATETIME
値には、9999
年までの日付が許容されています。
全てのMySQLの日付機能は一つのソースファイル、sql/time.cc
で実行されており、2000年問題に対して安全にプログラムされています。
MySQLでは、YEAR
データタイプは
0
年と 1901
年から 2155
年を1バイトで格納する事ができ、2桁か4桁でそれらを表示します。全ての2桁の年は
1970
年から 2069
年の範囲だと判断されます。ですので、YEAR
カラムに 01
を格納すると、MySQLサーバはそれを
2001
年として扱います。
MySQLサーバ自体がY2Kに対して安全だとしても、そうでないアプリケーションと共に利用すると問題が起きる可能性があります。例えば、多くの古いアプリケーションは、4桁の値よりも、曖昧である2桁の値を利用して年を格納したりコントロールしたりします。この問題は、「欠けている」値を表す為に
00
や 99
などの値を利用するアプリケーションによって作られる可能性があります。残念ながら、異なるアプリケーションは異なるプログラマによって書かれており、それぞれが、異なる仕様や日付管理の関数を利用しているので、これらの問題を修正するのは難しいです。
それ故、MySQLサーバにY2Kの問題が無いとしても、曖昧でない値を入力する事は、アプリケーションの義務です。.2桁の年を含む日付の値は、世紀が不明な為曖昧です。MySQLは内部的に4桁を利用して年を格納するので、そのような値は4桁の形に修正されなければいけません。
DATETIME
、DATE
、TIMESTAMP
、そして
YEAR
タイプに対して、MySQLは次のルールを利用して曖昧な年の値の日付を修正します。
00-69
の範囲の年の値は
2000-2069
に変換されます。
70-99
の範囲の年の値は
1970-1999
に変換されます。
これらのルールは、データ値が何を表すかを妥当に推測する単なる経験則である事を覚えておいて下さい。もしMySQLが利用するルールが正しい値を導かなければ、4桁の年の値を含む、曖昧ではない入力が必要になります。
ORDER BY
は、2桁の年を持つ
YEAR
値を正しく分類します。
MIN()
や MAX()
等のようないくつかの関数は、YEAR
を数字に変換します。これは、これらの関数を利用すると、2桁の年の値は正確に機能しないという意味になります。この場合の修正は、TIMESTAMP
や YEAR
を4桁の年のフォーマットに変換するという事になります。