MySQLのYEAR(2)型:2桁の年を使うことが推奨されない理由
MySQLのYEAR(2)型は、年を2桁の形式で格納するデータ型です。例えば、「69」と入力すると1969年として保存されます。YEAR(2)では、1970年から2069年まで(「70」〜「69」)の範囲で年を指定できます。
MySQLが2桁の年を解釈するルール
MySQLは、以下のルールに従って2桁の年値を解釈します。
- 00〜69の範囲の年値は、2000〜2069年に変換されます。
- 70〜99の範囲の年値は、1970〜1999年に変換されます。
2桁の年を使うべきではない理由
日付値を2桁形式で保存することは避けるべきです。この形式で保存された値は、世紀が特定できないため曖昧になるからです。同じ「00」という値でも、1900年の可能性と2000年の可能性があり、データの意味が一意に定まりません。
以下のMySQLの実行例で、この問題をより明確に確認できます。
mysql> Create Table year_test(val year(2));
Query OK, 0 rows affected, 1 warning (0.23 sec)
mysql> insert into year_test(val) values('70');
Query OK, 1 row affected (0.14 sec)
mysql> insert into year_test(val) values('00');
Query OK, 1 row affected (0.06 sec)
mysql> select * from year_test;
+-----+
| val |
+-----+
| 70 |
| 00 |
+-----+
2 rows in set (0.00 sec)
mysql> select * from year_test where val = '1970';
+-----+
| val |
+-----+
| 70 |
+-----+
1 row in set (0.03 sec)
mysql> select * from year_test where val = '2000';
+-----+
| val |
+-----+
| 00 |
+-----+
1 row in set (0.00 sec)
mysql> select * from year_test where val = '1900';
Empty set (0.06 sec)この結果を見ると、「val」に「00」を保存した場合、それが「1900年」を意味するのか「2000年」を意味するのかは判別できません。MySQLは内部的にこれを2000年として解釈しており、「1900」で検索しても該当データは見つかりません。この曖昧さこそが、2桁の年を使用することの最大のリスクです。
現在のMySQLにおける注意点
なお、YEAR(2)型はMySQL 5.5.3以降で非推奨(deprecated)となり、MySQL 8.0では完全に削除されています。新規のテーブル設計では、4桁表現のYEAR(4)型やDATE型を使用し、常に西暦4桁で年を扱うことが強く推奨されます。これにより、世紀をまたぐデータでも誤解なく正確に管理できます。
-
MySQLで日付カラムから最新日付のレコードを取得する方法【MAX()とサブクエリの使い方】
MySQLで最も新しい日付を持つレコードを検索するには?テーブルの中から最も新しい日付(最新日)を取得したい場合は、集計関数 MAX() をサブクエリと組み合わせて使うのが効果的です。この記事では、実際にテーブルを作成し、日付型(DATE)のカラムから最新日付に該当するレコードを取り出す手順を、具体的なSQL例とともに解説します。1. サンプルテーブルの作成まず、以下のようにテーブルを作成します。Idは自動採番の主キー、ExpiryDateは日付型のカラムです。mysql> create table DemoTable ( Id int NOT NULL AUTO_INCREME
-
MySQLで列の値をシャッフルする方法【ORDER BY RAND()の使い方】
MySQLでテーブル内のレコード(列の値)をランダムに並べ替えたい場合は、ORDER BY RAND()を使用します。この記事では、実際にテーブルを作成し、データを挿入して、シャッフルの動作を手順ごとに確認していきましょう。 1. テーブルの作成 まず、以下のコマンドでサンプル用のテーブルを作成します。 mysql> create table DemoTable1557 -> ( -> SubjectId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> SubjectName varchar(20) -&