Datatype default 값의 변경

  • 8.0부터는 BLOB, TEXT, GEOMETRY, JSON Datatype을 가지는 컬럼에 default 값을 부여할 수 있게 되었다.

  • 컬럼의 default 값으로 function을 추가하여 사용할 수 있게 되었다. (date 와 timestamp 형식에만 사용될 수 있었던 now, current_timestamp 등을 다른 형식의 data type에서도 사용이 가능하다.

    mysql 8.0 [localhost] {msandbox} (test) > create table tbl (a int, b text default ('no data here'), c varchar(20) default (current_timestamp), d char(36) default (uuid()));
    Query OK, 0 rows affected (0.03 sec)
    
    --^^ default 값에 괄호를 추가하여, BLOB, TEXT, GEOMETRY, JSON Datatype 에서도 default 값을 추가할 수 있다.
    
    mysql 8.0 [localhost] {msandbox} (test) > insert into tbl (a) values (1);
    Query OK, 1 row affected (0.09 sec)
    
    mysql 8.0 [localhost] {msandbox} (test) > select * from tbl;
    +------+--------------+---------------------+--------------------------------------+
    | a    | b            | c                   | d                                    |
    +------+--------------+---------------------+--------------------------------------+
    |    1 | no data here | 2018-12-18 14:23:15 | 056c2362-0285-11e9-b9f4-1436d38009ac |
    +------+--------------+---------------------+--------------------------------------+
    1 row in set (0.00 sec)
    

explicit_defaults_for_timestamp default 값 변경 (OFF → ON)

  • explicit_defaults_for_timestamp (Non-santadard 형식의 timestamp default 값으로 자동으로 사용할 수 없게 하는지에 대한 여부)변수의 값이 default로 off 에서 on 으로 변경이 되면서, timestamp datatype을 선언할때 주의해야 한다.

  • 이로서, 더이상 “왜 default를 지정하지 않았음에도 현재시간이 들어가는가에 대한”논란은 종지부를 찍게 되었다.

  • 버젼별 비교

    • 5.7

      mysql 5.7 [localhost] {msandbox} (test) > select @@version, @@global.explicit_defaults_for_timestamp;
      +-----------+------------------------------------------+
      | @@version | @@global.explicit_defaults_for_timestamp |
      +-----------+------------------------------------------+
      | 5.7.24    |                                        0 |
      +-----------+------------------------------------------+
      1 row in set (0.00 sec)
      
      mysql 5.7 [localhost] {msandbox} (test) > create table test.ts (a int, b timestamp);
      Query OK, 0 rows affected (0.02 sec)
      
      mysql 5.7 [localhost] {msandbox} (test) > show create table test.ts;
      ...
      | ts    | CREATE TABLE `ts` (
        `a` int(11) DEFAULT NULL,
        `b` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
      ...
      1 row in set (0.00 sec)
      
      -- Table 생성시, timestamp 만 선언했지만 자동으로 'NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' 이 속성으로 주어진다.
      ---- 이는 테이블의 첫번째 timestamp에만 적용이되며, 두번째 timestamp에도 속성을 지정하지 않느다면, default 값을 지정하라는 에러가 발생된다.
      ---- e.g. create table test.ts (a int, b timestamp, c timestamp); -> ERROR 1067 (42000): Invalid default value for 'c'
      
      
      mysql 5.7 [localhost] {msandbox} (test) > insert into test.ts (a) values (1);
      Query OK, 1 row affected (0.00 sec)
      
      mysql 5.7 [localhost] {msandbox} (test) > select * from test.ts;
      +------+---------------------+
      | a    | b                   |
      +------+---------------------+
      |    1 | 2018-12-19 09:55:47 |
      +------+---------------------+
      1 row in set (0.00 sec)
      
    • 8.0

      
      mysql 8.0 [localhost] {msandbox} (test) > select @@version, @@global.explicit_defaults_for_timestamp;
      +-----------+------------------------------------------+
      | @@version | @@global.explicit_defaults_for_timestamp |
      +-----------+------------------------------------------+
      | 8.0.13    |                                        1 |
      +-----------+------------------------------------------+
      1 row in set (0.00 sec)
      
      mysql 8.0 [localhost] {msandbox} (test) > create table test.ts (a int, b timestamp);
      Query OK, 0 rows affected (0.10 sec)
      
      mysql 8.0 [localhost] {msandbox} (test) > show create table test.ts;
      ...
      | ts    | CREATE TABLE `ts` (
        `a` int(11) DEFAULT NULL,
        `b` timestamp NULL DEFAULT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
      ...
      1 row in set (0.00 sec)
      
      -- Table 생성시, timestamp 만 선언했다면 자동으로 'NULL DEFAULT NULL' 이 속성으로 주어진다. 이는 explicit_defaults_for_timestamp=0 일때,  create table test.ts (a int, b timestamp null); 로 설정하는것과 동일하다.
      
      
      mysql 8.0 [localhost] {msandbox} (test) > insert into test.ts (a) values (1);
      Query OK, 1 row affected (0.10 sec)
      
      mysql 8.0 [localhost] {msandbox} (test) > select * from test.ts;
      +------+------+
      | a    | b    |
      +------+------+
      |    1 | NULL |
      +------+------+
      1 row in set (0.00 sec)
      
  • 5.7과 같은 행동을 사용하기 위해서는 explicit_defaults_for_timestamp 의 값을 OFF 로 사용해야 한다.

    • https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp