MySQL サーバー自体は 2000 年(Y2K)コンプライアンスに対して何も問題はありません。
MySQL は、TIMESTAMP
値にて、日付を
2038
年まで扱う Unix
時間関数を利用しています。DATE
と DATETIME
値には、9999
年までの日付が許容されています。
すべての MySQL の日付関数は 1
つのソースファイル、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
桁の年のフォーマットに変換するということになります。