Rolling release(つまりSTS)なのですが、2024年8月にMariaDB11.5がGAになりました。
(参考)
https://mariadb.com/kb/en/changes-improvements-in-mariadb-11-5
気になっていたtimestamp拡張が入り、
2106-02-07 06:28:15 UTC
までtimestampを扱えるようになりました。
実際に、10.11と11.5で比較してみました。
なお、timezoneは日本にしています。
MariaDB 10.11
-- int max
> set timestamp = 2147483647; select now();
Query OK, 0 rows affected (0.000 sec)
+---------------------+
| now() |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- int max + 1
> set timestamp = 2147483648; select now();
ERROR 1231 (42000): Variable 'timestamp' can't be set to the value of '2147483648'
+---------------------+
| now() |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- unsigned int max
> set timestamp = 4294967295; select now();
ERROR 1231 (42000): Variable 'timestamp' can't be set to the value of '4294967295'
+---------------------+
| now() |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- unsigned int max + 1
> set timestamp = 4294967296; select now();
ERROR 1231 (42000): Variable 'timestamp' can't be set to the value of '4294967296'
+---------------------+
| now() |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
見てもらえればわかりますが、
2038-01-19 12:14:07
が限界となっています。
MariaDB 11.5
-- int max
> set timestamp = 2147483647; select now();
Query OK, 0 rows affected (0.001 sec)
+---------------------+
| now() |
+---------------------+
| 2038-01-19 12:14:07 |
+---------------------+
-- int max + 1
> set timestamp = 2147483648; select now();
Query OK, 0 rows affected (0.001 sec)
+---------------------+
| now() |
+---------------------+
| 2038-01-19 12:14:08 |
+---------------------+
この時点で、超えましたね。
-- unsigned int max
> set timestamp = 4294967295; select now();
Query OK, 0 rows affected (0.001 sec)
+---------------------+
| now() |
+---------------------+
| 2106-02-07 15:28:15 |
+---------------------+
-- unsigned int max + 1
> set timestamp = 4294967296; select now();
Query OK, 0 rows affected, 1 warning (0.001 sec)
+---------------------+
| now() |
+---------------------+
| 2106-02-07 15:28:15 |
+---------------------+
> show warnings;
+---------+------+---------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------+
| Warning | 1292 | Truncated incorrect timestamp value: '4294967296' |
+---------+------+---------------------------------------------------+
unsigned int の最大値を超えるとwaningはでましたが、
2106-02-07 15:28:15
まで最大値が伸びているようです。
そもそも、timestampをunsignedにしたというのは、ドライバー影響を抑えるという名目だったかなと。
で、実際に以下のようにデータを入れてみます。
CREATE TABLE `t1` (
`c1` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
insert into t1 values ('2106-02-07 15:28:15');
> select * from t1;
+---------------------+
| c1 |
+---------------------+
| 2106-02-07 15:28:15 |
+---------------------+
これをPHPとC#(mysqlconnector)で取得してみたところ、
2106-02-07 15:28:15
が取得できることは確認できました。
MySQL側も同様の対応をしてくれると嬉しいです。
以上
コメントがあればどうぞ