Last Updated on 9월 27, 2023 by Jade(정현호)
MySQL INT Zerofill
보통의 DBMS의 컬럼형에서 ()괄호를 사용할 경우 ()괄호 안에는 숫자의 의미는 사용할 수 있는 자리수나 바이트의 제한 또는 정수부 와 소수부를 구분하는 등의 길이의 의미로 대체로 사용되고 있습니다.
MySQL의 정수형 컬럼인 INT, BIGINT, SMALLINT, TINYINT 은 이미 고정형 데이터 타입으로 ()괄호의 사용이 위에서 언급한 부분과는 조금은 다른 의미로 사용됩니다.
예를 들어 BIGINT(10) 과 같은 경우 정수 값의 길이를 10자리로 제한할 수 있을 것이라고 생각 할 수 있습니다
ZEROFILL 옵션을 이용하여 옵션의 사용 여부에 따른 차이를 확인해보도록 하겠습니다.
mysql> create table tb_int_test ( col1 bigint(10) ZEROFILL ); mysql> insert into tb_int_test values (123),(12345),(1234567),(1234567891011); mysql> select * from tb_int_test; +---------------+ | col1 | +---------------+ | 0000000123 | | 0000012345 | | 0001234567 | | 1234567891011 | +---------------+ mysql> create table tb_int_test_no_zerofill ( col1 bigint(10) ); mysql> insert into tb_int_test_no_zerofill values (123),(12345),(1234567),(1234567891011); mysql> select * from tb_int_test_no_zerofill; +---------------+ | col1 | +---------------+ | 123 | | 12345 | | 1234567 | | 1234567891011 | +---------------+
MySQL에서 모든 정수 타입 생성시 뒤에 ()괄호는 값의 길이를 설정 또는 제한하는 용도가 아닌 화면에 표시할 자리 수를 의미합니다.
이 화면의 표시할 자리수라는 것도 ZEROFILL 옵션을 사용하였을 경우 숫자 왼쪽에 채워서(패딩) 표시하는 의미 입니다.
그래서 조회 결과를 보면 처음 3개의 숫자는 0이 채워져서 10자리를 만들어진 것을 확인할 수 있으며, 10자리가 넘는 숫자 1234567891011 도 문제없이 저장 및 조회가 되는 것을 확인할 수 있습니다.
즉 ZEROFILL 옵션을 사용하였을 경우 몇 자리까지 0을 붙여서(패딩) 표현할지에 사용되는 ()괄호 입니다.
그래서 정수 타입에서 ZEROFILL 의 옵션이 없다면 ()괄호는 의미가 없으며 ZEROFILL 옵션을 사용하게 된다면 해당 컬럼은 양의숫자(양수)만 저장할 수 있는 UNSIGNED 타입이 되게 됨으로 주의해야 할 부분입니다.
테이블 생성 구문으로 확인해보면 아래와 같이 ZEROFILL 옵션을 사용한 컬럼은 UNSIGNED 로 생성되는 것을 확인할 수 있습니다.
mysql> show create table tb_int_test\G *************************** 1. row *************************** Table: tb_int_test Create Table: CREATE TABLE `tb_int_test` ( `col1` bigint(10) unsigned zerofill DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
[참고] 음수, 양수 모두를 표현할 수 있는 것은 SIGNED 이고 기본 값입니다. UNSIGNED 를 명시적으로 지정하면 양수만 사용할 수 있습니다.
MySQL 8.0.17
MySQL 8.0.17 버전부터 이러한 INT Zerofill 기능이 Deprecated 되었습니다.
WL#13127: Deprecate integer display width and ZEROFILL option
Deprecate the ZEROFILL attribute for numeric data types and the display width attribute for integer types. ZEROFILL and display width do not affect the storage size of the data type, only the display width. How the numbers are displayed, can be controlled by other means. For example, applications could use the LPAD function to zero-pad numbers up to the desired width, or they could store the formatted numbers in CHAR columns.
테이블을 생성하거나 Alter 로 변경 또는 Add 추가하게 되면 아래와 같은 Warning이 발생합니다.
0 row(s) affected, 1 warning(s): 1681 Integer display width is deprecated and will be removed in a future release. Records: 0 Duplicates: 0 Warnings: 1
향후 버전에서는 제거(removed) 될 수 있으므로 지금의 Zerofill 처럼 표시하려면 LPAD 함수를 사용하여 0 으로 채워서 표시할 수 있습니다.
mysql> SELECT id, LPAD(zip_code, 5, '0') as zip_code FROM my_zip_codes; +----+----------+ | id | zip_code | +----+----------+ | 1 | 01234 | | 2 | 54321 | | 3 | 00123 | | 4 | 98765 | +----+----------+
Reference
Reference Book
• 개발자와 DBA를 위한 Real MySQL
Reference Link
• WL#13127: Deprecate integer display width and ZEROFILL option
• dev.mysql.com/numeric-type-attributes
• deprecate-mysql-integer-display-width-and-zerofill
연관된 다른 글





Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io