본문 바로가기

MySQL/Performance

표시형식 이라고 들어보셨나요?


안녕하세요 박성원입니다. 쿠쿠~


간만에 포스팅입니다. 사실 max_connection 후 어떤 글을 쓸까 하다가 처음 mysql을 다루면서 당혹스러웠던 점을 소개 해 볼까 합니다.

그거슨.. 바로바로바로바로 DATA TYPE이 되겠습니다.

오늘은 그중에서 "수치 컬럼 타입"에 대해서 알아보도록 하죠 ^^;

우선 아래 표를 보시겠습니다.

type

inforamtion

Tinyint

매우 작은 정수

Smallint

작은 정수

Mediumint

중간 크기의 정수

Int

표준 정수

Bigint

큰 정수

Float

단정도 부정소수

Double

배정도 부정소수

Decimal

부동 소수, 문자열로 표현



상당히 깔끔한 표입니다. mysql 4.0 메뉴얼에서 보고 적은거지요 ^^;;

여기까지는 참~ 쉽죠잉~~ 말그대로 어느정도 이해가 가실겁니다.

정수는 음수와 양수를 포함한 것으로 은하계 안의 별들의 수, 사람의 뼈조각수, 전세계의 인구수등과 같이 소수점 이하를 포함하지 않는 데이터를 표현합니다.
부정소수는 음수와 양수를 포함하며, 소수를 포함한 것으로 출산율, 실업률(컥~;;) 등과 같이 소수점을 포함한 수치를 표현합니다.

예가 적당했는지 모르겠습니다.(요즘 경기가 경기인만큼 실업률을 예로 들어봤습니다.^^)

흠.. 그럼 다시 위쪽 표를 보시면 큰수? 작은수?? 어디에 비교해서.. 라는 의문점이 들겠죠 그래서 아래와 같이 각 숫자들은 지정된 범위의 값들을 표시할 수 있습니다.


절때루 타이핑이 치기 싫어서 그런건아니구요 ㅋㅋ 인터넷에 있길래 가져와 봤습니다.

먼가 복잡하긴하지만 그래도 표시되는 수치를 알수있지요 ^^;;


자~ 그럼 이제 슬슬 본론으로 들어가볼까요?(먼 서론이 일케 길었는지 덜덜~~)

표시형식 즉, int(num) 에서 (num) 이넘에 대한 이야기입니다.

ORACLE에서는 int(num)은 num은 크기를 설정해 주는 기특한 넘입니다.
그르나~~ mysql에서는 단순한 표시형식일 뿐이라는것이지요 ^^;

예를 들면...
int 를 선언하게 되면 디폴트 값인 11로 세팅됩니다. 그렇다면 int 와 int(5)는 어떻게 차이가 날까요? int의 데이터 저장공간은 4byte입니다. 그럼 int(11)이 4byte 이니까 int(5)는 당연히 그 반의 공간인 2byte만 차지할까요?

결과는 참담합니다. 전혀~ never 그렇게 되지 않습니다. 표시형식 즉 zerofill과 같이 표시폭에 어떠한 변화를 주는 것들과 함께 쓰이는 것이죠... ^^;;

그럼 int(1) 이렇게 하면 한자리만 표시가 되나요? 그건 또아니죠 ^^;

사실 서두에서 말씀드린 아무짝에도 쓸모없다는 것처럼 int(1)의 경우도 int가 기본적으로 사용가능한 범위내의 값이 들어오면 그 값을 모두 수용하고 또 출력할 수 있는 그런 구조로 되어있지요 ^^;;

예를 만들어보죠 ^^;
create table `test_type` (
 a int not null default 0,
 b int(1) not null default 0,
 c int(10) not null default 0,
 d int(100) not null default 0,
 e int(200) not null default 0,
 f int(255) not null default 0
)
insert into test_type values (1,1,1,1,1,1);
insert into test_type values (2147483648,2147483648,2147483648,2147483648,2147483648,2147483648);

자 조회를 하면 결과가 어떻게 나올까요?
a b c d e f
1 1 1 1 1 1
2147483647 2147483647 2147483647 2147483647 2147483647 2147483647

이렇게 도출도출 됩니다. 즉, 양수의 허용값 초소값 1 부터 최대값 2147483647이 입력되는걸 보셨죠 ^^

한가지 주의 하셔야할 점이 위의 insert 구문에서도 보듯이 입력값은 최대값보다 +1 이 크죠?
그래서 그 큰값은 들어가지 않고 max값이 들어가게 되는 것이죠 ㅋ


그럼 왜쓰는건가? 라는 의문을 저도 첨 가지게 되었습니다만, zerofill과 같은 표시값에 대한 결과를 도출하기 위함으로 생각되는데요 ^^;;; 사실 아직 내공이 부족해서 인지 찾아보지 않고 그냥 그런거구나~ 하고있습니다.

오늘 포스팅하면서 찾아볼 요량으로 책을 독파하고 웹문서를 뒤졌지만 결과는 역시 알수없군요... 이쯤되면 mysql 개발자에게 메일을 보내야할지도 ^^;;



여튼.. mysql은 이런 재미난 일도 있답니다.
그럼 다음에는 문자열 타입에 대한 포스팅을 준비하도록 할께요 ^^;

'MySQL > Performance' 카테고리의 다른 글

[긴급] Mysql Connection Full 발생!!  (4) 2009.06.12