개발/MySQL

mysql varchar size변경

보리ing 2021. 9. 28. 11:36

출처 - https://kimdubi.github.io/mysql/varchar/

 

대량의 데이터가 적자될 것으로 예상되는 테이블에 컬럼 추가 필요성을 느껴 작업을 하게 되었다.

문제는 스펙에 사이즈가 나와있어, 해당 사이즈를 명확히 할 것인지.

스펙을 정의한 곳에 신뢰가 완전하지 않아 여유를 둘 것인지에 대한 고민이다.

물론 varchar형태가 가변형이기 때문에 크게 해도 성능상 이슈가 없으니 미리 크게 잡아두는게 편하지 않냐는 생각과

명확한 사이즈를 통해 해당 길이의 패턴이나 의미전달을 할 수 있지 않을까란 생각이 또 충돌하였다.

 

추후 사이즈를 변경하는것에 대한 부담감을 갖지 않도록 사이즈 변경은 db에 무리없이 작업할 수 있는지 알아봤다.

 

1. varchar size 256 bytes 이하구간에서 증가시키는 경우

### varchar(1) => varchar(63)

mysql> alter table test modify a varchar(63), algorithm=inplace, lock = none;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

metadata만 변경되므로 부담없다.

 

2. 256bytes 이하에서 256bytes이상으로 증가시키는 경우

### vachar(63) => varchar(64)

mysql> alter table test modify a varchar(64), algorithm=inplace, lock = none;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

algorithm=COPY 방식을 사용하여야 한다.

즉 부담될 수 있다.

 

3. 256bytes 이상에서 증가시키는 경우

### varchar(64) => 그 이상

mysql> alter table test modify b varchar(640), algorithm=inplace, lock = none;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

metadata만 변경되므로 부담없다.

 

4. 사이즈를 줄이는 경우

       Table: test
Create Table: CREATE TABLE `test` (
  `a` varchar(63) DEFAULT NULL,
  `b` varchar(640) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)



mysql> alter table test modify b varchar(600), algorithm=inplace, lock = none;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
mysql> alter table test modify a varchar(1), algorithm=inplace, lock = none;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.

algorithm=COPY 방식을 사용하여야 한다.

즉 부담될 수 있다.

 

 

정리.

  • 사이즈를 증가하는 경우 크기가256bytes을 지나치게 된다면 algorithm=COPY 방식을 사용하여야 해서 부담이 될 수 있다.
  • 줄이는 경우는 크기와 상관없이 모두 algorithm=COPY 방식을 사용하여야 하기 때문에 부담된다. 

 

기타

  • charset이 utf8mb인 경우 1글자(varchar1)당 4byte이기 때문에 varchar(64)가 기준이 된다.
  • charset이 utf8은 1글자당 3byte이고, varchar(86)이 기준이 된다.
  • 256bytes가 기준이 되는 이유는 256bytes를 초과하게 되면 MySql 내부적으로 컬럼의 실제 저장 길이를 관리하는 flag가 1 byte에서 2byte로 커져야 하기 때문이다.