かみぽわーる

kamipo's blog

MySQLにうるう秒は保存できるのか試した

結果、保存できなかった😢

SET sql_mode = STRICT_ALL_TABLES;

CREATE TABLE time_leap (
  dt datetime,
  ts timestamp
) ENGINE=InnoDB;

INSERT INTO time_leap VALUES ('2012-06-30 23:59:59', '2012-06-30 23:59:59');
-- Query OK, 1 row affected (0.02 sec)

INSERT INTO time_leap VALUES ('2012-06-30 23:59:60', '2012-06-30 23:59:60');
-- ERROR 1292 (22007): Incorrect datetime value: '2012-06-30 23:59:60' for column 'dt' at row 1

これを試そうと思ったのは、timestamp型は内部表現がepoch秒なのでうるう秒保存するの無理だろうけどdatetime型は秒の精度に6bit割いてるので[0, 64)の範囲の値を保存できるだけの精度を持ってると思ったんですけど、よく見たらドキュメントに6 bits second (0-59)って書いてたしどこかでバリデーションしてるんでしょうねきっと。