MySQLで型の最小値・最大値を超える値を設定してみる

MySQLで型の最小値・最大値を超える値を設定してみる。

数値型の場合

確認用のテーブルを作成する。

create table sample (
  c_tinyint           tinyint,
  c_tinyint_unsigned  tinyint unsigned,
  c_smallint          smallint,
  c_smallint_unsigned smallint unsigned,
  c_int               int,
  c_int_unsigned      int unsigned,
  c_bigint            bigint,
  c_bigint_unsigned   bigint unsigned
);

すごく小さな値をINSERTする。

insert into sample (
  c_tinyint,
  c_tinyint_unsigned,
  c_smallint,
  c_smallint_unsigned,
  c_int,
  c_int_unsigned,
  c_bigint,
  c_bigint_unsigned
) values (
  -99999999999999999999,
  -99999999999999999999,
  -99999999999999999999,
  -99999999999999999999,
  -99999999999999999999,
  -99999999999999999999,
  -99999999999999999999,
  -99999999999999999999
);

すごく大きな値をINSERTする。

insert into sample (
  c_tinyint,
  c_tinyint_unsigned,
  c_smallint,
  c_smallint_unsigned,
  c_int,
  c_int_unsigned,
  c_bigint,
  c_bigint_unsigned
) values (
  99999999999999999999,
  99999999999999999999,
  99999999999999999999,
  99999999999999999999,
  99999999999999999999,
  99999999999999999999,
  99999999999999999999,
  99999999999999999999
);

各型の最小値・最大値が設定される。

select * from sample;
+-----------+--------------------+------------+---------------------+-------------+----------------+----------------------+----------------------+
| c_tinyint | c_tinyint_unsigned | c_smallint | c_smallint_unsigned | c_int       | c_int_unsigned | c_bigint             | c_bigint_unsigned    |
+-----------+--------------------+------------+---------------------+-------------+----------------+----------------------+----------------------+
|      -128 |                  0 |     -32768 |                   0 | -2147483648 |              0 | -9223372036854775808 |                    0 |
|       127 |                255 |      32767 |               65535 |  2147483647 |     4294967295 |  9223372036854775807 | 18446744073709551615 |
+-----------+--------------------+------------+---------------------+-------------+----------------+----------------------+----------------------+

文字列型の場合

確認用のテーブルを作成し、サイズを超える文字数を設定する。

create table sample (
  c_varchar4 varchar(4)
);
insert into sample (
  c_varchar4
) values (
  'abcdefghijklmnopqrstuvwxyz'
);

カットされて設定される。

select * from sample;
+------------+
| c_varchar4 |
+------------+
| abcd       |
+------------+

日付型の場合

確認用のテーブルを作成する。

create table sample (
  c_timestamp timestamp,
  c_datetime  datetime
);

ちなみにタイムゾーンJSTの状態。

show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+

小さな日時と大きな日時をINSERTする。

insert into sample (
  c_timestamp,
  c_datetime
) values (
  '1970-01-01 09:00:00',
  '0000-00-00 00:00:00'
);
insert into sample (
  c_timestamp,
  c_datetime
) values (
  '2038-1-19 12:14:8',
  '10000-01-01 00:00:00'
);

全部「0000-00-00 00:00:00」になる。

select * from sample;
+---------------------+---------------------+
| c_timestamp         | c_datetime          |
+---------------------+---------------------+
| 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+---------------------+---------------------+

下記の値だと設定される。

insert into sample (
  c_timestamp,
  c_datetime
) values (
  '1970-01-01 09:00:01',
  '0000-00-00 00:00:01'
);
insert into sample (
  c_timestamp,
  c_datetime
) values (
  '2038-1-19 12:14:7',
  '9999-12-31 23:59:59'
);
select * from sample;
+---------------------+---------------------+
| c_timestamp         | c_datetime          |
+---------------------+---------------------+
| 1970-01-01 09:00:01 | 0000-00-00 00:00:01 |
| 2038-01-19 12:14:07 | 9999-12-31 23:59:59 |
+---------------------+---------------------+