MySQL zerofill

2023. 12. 25. 04:12카테고리 없음

728x90
반응형

1. MySQL zerofill

보통 DBMS에서 ()괄호를 사용할 경우 ()괄호 안에는 숫자의 의미는 대체로 사용할 수 있는 자리수나 바이트의 제한 또는 정수부 와 소수부를 구분하는 등의 길이의 의미로 사용된다.

 

그런데 MySQL의 정수형 컬럼인 INT, BIGINT, SMALLINT, TINYINT 은 이미 고정형 데이터 타입으로 크기를 제한하는 위의 예시와 다르게 사용된다.

varchar(10) //문자열 길이 제한
float(10, 2) //정수부, 소수부 길이 제한 (총 10자리 중 소수부 2자리)
int(10) //???

 

정수형 컬럼은 zerofill 옵션을 사용한다면 괄호안의 숫자만큼 빈곳을 0으로 표시한다.

MariaDB [TEST]> create table test
    -> (
    ->   col int(5) zerofill
    -> );

MariaDB [TEST]> insert into test values (123), (12345), (1234567);

MariaDB [TEST]> select * from test;
+---------+
| col     |
+---------+
|   00123 |
|   12345 |
| 1234567 |
+---------+

 

위의 예시에서 숫자 123이 들어간 첫번째 row가 select 시에 00123으로 되어있는 것을 볼 수 있다.

 

이처럼 정수형의 괄호는 값의 길이를 설정, 제한하는 용도가 아닌 화면에 표시할 자리수를 의미한다. (zerofill 옵션 사용시)


2. 주의할 점

zerofill 옵션을 사용할때는 주의할 점이 있다.

 

정수 타입에서 zerofill 옵션을 사용한다면 해당 컬럼은 자동으로 unsigned가 된다는 것이다.

 

아래와 같이 테이블 생성 구문을 확인해보면 zerofill 옵션을 사용한 컬럼은 unsigned로 생성된 것을 확인할 수 있다.

MariaDB [TEST]> show create table test;
+-------+---------------------+---------------------------------------------+
| Table | Create Table        |                                             |
+-------+---------------------+---------------------------------------------+
| test  | CREATE TABLE `test` (                                             |
|       |  `col` int(5) unsigned zerofill DEFAULT NULL                      |
|       |) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci |
+-------+-------------------------------------------------------------------+

3. deprecated

MySQL 8.0.17부터 numeric data type의 zerofill 옵션은 deprecate 되었다.

 

앞으로 자리수 패딩이 필요한 상황이라면 LPAD() 함수를 사용하는 것이 좋다.

MariaDB [TEST]> select LPAD(123, 5, 0);
+-----------------+
| LPAD(123, 5, 0) |
+-----------------+
| 00123           |
+-----------------+
728x90
반응형