目次

目次

MySQLのDATE型にINSERTできる日付フォーマット

アバター画像
海津 純平
アバター画像
海津 純平
最終更新日2018/09/26 投稿日2018/09/26

はじめに

'2018-05-31' でも '20180531' でも正しくINSERTできたので、どこまでできるのか調べてみました。

  • MySQL Version 5.7.22

検証

とりあえずDATE型のカラムがあるテーブルを作成します。

mysql> CREATE TABLE date_table(id INT(11), date_column DATE);

まず普通に - 区切り。'2018-05-31' 当然正しく入ります。

mysql> INSERT INTO date_table VALUES(1, '2018-05-31');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM date_table WHERE id = 1;
+------+-------------+
| id   | date_column |
+------+-------------+
|    1 | 2018-05-31  |
+------+-------------+
1 row in set (0.00 sec)

/ 区切りも正しく入ります。'2018/05/31'

mysql> INSERT INTO date_table VALUES(2, '2018/05/31');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM date_table WHERE id = 2;
+------+-------------+
| id   | date_column |
+------+-------------+
|    2 | 2018-05-31  |
+------+-------------+
1 row in set (0.00 sec)

区切り文字なしでもいけます。 '20180531'

mysql> INSERT INTO date_table VALUES(3, '20180531');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM date_table WHERE id = 3;
+------+-------------+
| id   | date_column |
+------+-------------+
|    3 | 2018-05-31  |
+------+-------------+
1 row in set (0.00 sec)

半角記号ならなんでもいけるようです。

'2018+05+31''2018{05>31' をINSERTしてみました。

mysql> INSERT INTO date_table VALUES(4, '2018+05+31');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO date_table VALUES(5, '2018{05>31');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM date_table WHERE id IN (4, 5);
+------+-------------+
| id   | date_column |
+------+-------------+
|    4 | 2018-05-31  |
|    5 | 2018-05-31  |
+------+-------------+
2 rows in set (0.00 sec)

ただしバックスラッシュ \ はエスケープ文字なので偶数個重ねる必要があります。

mysql> INSERT INTO date_table VALUES(6, '2018\05\31');
ERROR 1292 (22007): Incorrect date value: '2018' for column 'date_column' at row 1
mysql> INSERT INTO date_table VALUES(7, '2018\\05\\31');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM date_table WHERE id IN (6, 7);
+------+-------------+
| id   | date_column |
+------+-------------+
|    7 | 2018-05-31  |
+------+-------------+
1 row in set (0.00 sec)

半角文字 '2018a05z31' や全角文字 '2018年05月31日' はだめでした。

mysql> INSERT INTO date_table VALUES(8, '2018a05z31');
ERROR 1292 (22007): Incorrect date value: '2018a05z31' for column 'date_column' at row 1
mysql> INSERT INTO date_table VALUES(9, '2018年05月31日');
ERROR 1292 (22007): Incorrect date value: '2018年05月31日' for column 'date_column' at row 1

半角記号ならば何個重ねても良いようなので、 '2018~!@#$05^&amp;*()31'code>’2018~!@#$05^&amp;*()31′</code とかでもできました。

mysql> INSERT INTO date_table VALUES(10, '2018~!@#$05^&amp;*()31');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM date_table WHERE id = 10;
+------+-------------+
| id   | date_column |
+------+-------------+
|   10 | 2018-05-31  |
+------+-------------+
1 row in set (0.00 sec)

正しい年月日の範囲ならば何桁でも良いようです。 頭に 0 をつけてINSERTしてみました。

mysql> INSERT INTO date_table VALUES(11, '002018-0005-0031');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM date_table WHERE id = 11;
+------+-------------+
| id   | date_column |
+------+-------------+
|   11 | 2018-05-31  |
+------+-------------+
1 row in set (0.00 sec)

まとめ

この仕様ありがたいのか迷惑なのか。。。 用法用量をお守りください。

アバター画像

海津 純平

目次