본문 바로가기

Database

[MySQL] MySQL의 int(n) 형태 데이터의 의미

반응형

메모만 해두고 블로그에 적는 것을 까먹고 있었던 내용을 간만에 적어본다.

혹시 테이블 생성할 때, INT 에 괄호치고 값을 넣어 본 기억이 있는가?
아니면, 왜 이거 INT(8)이야? 하면서 테이블 생성자에게 화를 내본적이 있는가?

그렇다면....... 당신은 바보~ -0-/
헉...!!! ..... 내가 말을 잘 못했소... 돌던지지 말아주시오~~

(*,.ㅜ);;

자... 간단히 테스트를 해보자.

<< 예제 >>
##################################################################################################
# 1. 테스트 테이블 생성

CREATE TABLE int_test (
int_1 INT(1),
int_1_z INT(1) ZEROFILL,
int_5 INT(5),
int_5_z INT(5) ZEROFILL,
int_9 INT(9),
int_9_z INT(9) ZEROFILL,
int_11 INT(11),
int_11_z INT(11) ZEROFILL
)ENGINE=INNODB DEFAULT CHAR SET =UTF8;

# ---------------------------------------------------------------------------

# 2. 테스트 값 넣어보기

INSERT INTO int_test VALUES(1,1,1,1,1,1,1,1);
INSERT INTO int_test VALUES(12345,12345,12345,12345,12345,12345,12345,12345);
INSERT INTO int_test VALUES(1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890,1234567890);
##################################################################################################

당신의 평소 생각대로라면,
# ------------------------------
SELECT *
FROM int_test;
# ------------------------------
의 결과는?

<< 수행 결과 >>
mysql> SELECT * FROM int_test;
+------------+------------+------------+------------+------------+------------+------------+-------------+
| int_1 | int_1_z | int_5 | int_5_z | int_9 | int_9_z | int_11 | int_11_z |
+------------+------------+------------+------------+------------+------------+------------+-------------+
| 1 | 1 | 1 | 00001 | 1 | 000000001 | 1 | 00000000001 |
| 12345 | 12345 | 12345 | 12345 | 12345 | 000012345 | 12345 | 00000012345 |
| 1234567890 | 1234567890 | 1234567890 | 1234567890 | 1234567890 | 1234567890 | 1234567890 | 01234567890 |
+------------+------------+------------+------------+------------+------------+------------+-------------+
3 rows in set (0.00 sec)


얼래? 이거... 당신이 예상하던 값과는 다르지 아니한가?

분명히 INT(n)하면 n개만 입력될 것이라 생각했었는데,
값이 몽땅 들어가버리네???

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html
를 보면, 이에 대한 명확한 설명이 있다..

짧은 잉글리쉬 실력으로 요약해 보자면,

INT의 괄호는 보여지는 숫자의 개수의 제약을 의미하는 것이 아니다.
아무리 INT 옆에 괄호치고 숫자를 넣어봐라, 들어갈 수 있는 한계는 언제나 같을 껄? ㅋㅋㅋ (의역 -0-;;)
INT의 괄호 옵션은 ZEROFILL을 위한 거다.
만약 괄호 안에 5를 집어넣었다면(INT(5)), 5자리 내의 숫자는 0으로 채워지게 된다.

쏼라쏼라....

개뿔.. 이넘의 짧은 영어... 영어 때문에 속이 울렁거린당 (-ㅠ-);;

요약하자면,
INT의 괄호 옵션 기능은 ZEROFILL에서 0이 채워지게 되는 개수이고,
실제 저장공간 및 입력 가능 한계는 동일하다는 의미이다.


위 실행결과에서도 볼 수 있듯이,
INT(1), INT(5), INT(9), INT(11)에 들어가는 값은 동일하며,
INT(1) ZEROFILL, INT(5) ZEROFILL, INT(9) ZEROFILL, INT(11) ZEROFILL 에서만,
0이 들어가는 개수에 차이가 있음을 볼 수 있다.

그나마 ZEROFILL의 한계를 넘어버리면, 그 때부턴 구분도 안 간다 -0-;;;;;

자, 정리하자!!

앞으로 INT(n) 에서 n이 자기 맘대로 들어가 있다고 애꿎은 사람 잡지말고,
'풋! ZEROFILL을 위한 공간이군! 쯧쯧쯧...'
하면서 아는체 해주는 쎈쓰를 보여라!!!

그럼, 당신은 위대한 인물로 추앙받고 존경받으리~~~ ......... 는 아니겠징 -0-;;;;

이상!






[2009-01-09] 덧글에 대한 설명을 위해 아래와 같이 추가합니다 ^0^/

결론부터 말씀드리자면, 오라클에서는 실제 자리수를 표현하는데 사용됩니다. ^^
아래 예제를 볼까요?

<< 예제 >>
##################################################################################################
# 1. 테스트 테이블 생성
CREATE TABLE number_test (
NUMBER_2 NUMBER(2),
NUMBER_5 NUMBER(5)
);
# ---------------------------------------------------------------------------

# 2. 테스트 값 넣어보기

INSERT INTO number_test VALUES(12,12);
INSERT INTO number_test VALUES(12345,12345);
##################################################################################################

의 결과는?

<< 수행 결과 >>

SQL> INSERT INTO number_test VALUES(12,12);

1 개의 행이 만들어졌습니다.

SQL> INSERT INTO number_test VALUES(12345,12345);
INSERT INTO number_test VALUES(12345,12345)
*
1
행에 오류:
ORA-01438: 이 열에 대해 지정된 전체 자릿수보다 큰 값이 허용됩니다.


SQL> SELECT * FROM number_test;

NUMBER_2 NUMBER_5
---------- ----------
12 12


참고가 되셨으면 합니다. ^^


출처 : http://blackbull.tistory.com/44
반응형