관리 메뉴

클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

SQL 고급 문법 1 - MySQL의 데이터 형식 1 : 데이터 형식 본문

알고리즘 및 자료 관리/SQL

SQL 고급 문법 1 - MySQL의 데이터 형식 1 : 데이터 형식

huenuri 2024. 10. 13. 15:45

이제 오후 공부를 시작해본다. 아침에 예배 끝나고 집에 와서 아침 공부를 시작한지 얼마 안 되서 너무 졸려서 40분 정도 낮잠을 잤다. 그리고 점심을 먹고 이제 다시 공부를 시작해본다. 조금 전에 들었던 강의는 거의 졸면서 들어서 다시 들어야 할 것 같다.

오후에는 4장을 공부해보려고 한다. 앞서 배운 SELECT, INSERT, YPDATE, DELETE만 잘 이해하면 테이블에서 원하는 내용을 추출해서 사용할 수 있다. 하지만 좀 더 효율적인 SQL을 만들고 활용하기 위해서는 데이터의 내부적인 구성을 이해하는 것이 좋다.

 

시작하기 전에

테이블을 만들 때는 데이터 형식을 설정해야 한다. 데이터 형식에는 크게 숫자형, 문자형, 날짜형이 있다. 세부적으로는 여러 개로 나뉘기도 한다. 이렇게 다양한 데이터 형식이 존재하는 이유는 실제로 저장될 데이터의 형태가 다양하기 때문이다. 각 데이터에 맞는 데이터 형식을 지정함으로써 효율적으로 저장할 수 있다.

예를 들어, 이름을 저장하기 위해 내부적으로 100 글자를 저장할 칸을 준비하는 것은 상당한 낭비이다.


 

 

 

데이터 형식

MySQL에서 제공하는 데이터 형식의 종류는 수십 개 정도이고, 각 데이터 형식마다 크거나 표현할 수 있는 숫자의 범위가 다르다. 자주 사용하는 것 위주로 살펴볼 것이다.

 

정수형

정수형은 소수점이 없는 숫자, 즉 인원 수, 가격, 수량 등에 많이 사용한다. 정수형의 크기와 범위는 다음과 같다.

 

1) 정수형을 벗어나는 범위일 때

확인 차원에서 간단하게 테이블을 만들어보겠다.

 

 

각 열의 최대값을 입력해본다.

 

이번에는 각 숫자에 1을 더해서 입력해본다. 마지막 값에는 0을 하나 더 붙였다.

 

이번에는 오류가 발생했다. Out of range는 입력값의 범위를 벗어났다는 의미이다.


 

 

 

2) 정수형 사용하기

앞서 만들었던 인터넷 마켓의 회원 테이블(member)에서 인원수(mem_number) 열은 INT로, 평균 키 열은 SMALLINT로 지정했다.

 

 

buy와 member 테이블이 존재하면 삭제하고 회원 테이블을 하나 생성한다. 인원수는 범위가 많을 필요가 없으니 TINYINT로 지정했고, 평균 키 역시 3만cm가 넘을리가 억으니 SAMLLINT로 지정했다.

하지만 TINYINT는 -128~127로 키가 200cm가 넘는 사람도 있으니 범위가 부족할 수 있다. 이를 해결하기 위해 값의 범위가 0부터 시작하는 UNSIGNED 예약어를 사용할 수 있다.

 

 

결국 회원 테이블은 다음과 같이 구성하는 것이 더 효율적이다.


 

 

 

문자형

문자형은 글자를 저장하기 위해 사용하며, 입력할 최대 글자의 개 수를 지정해야 한다. 대표적인 문자형은 다음과 같다.

 

 

CHAR는 문자를 의미하는 Character의 약자로, 고정길이 문자형이라고 부른다. 즉, 자릿수가 고정되어 있다. 예를 들어 CHAR(10)에 '가나다' 3글자만 저장해도 10자리를 모두 확보한 후에 앞에 3자리를 사용하고 뒤의 7자리는 낭비하게 된다. 이와 달리 VARCHAR(Variable Character)는 가변길이 문자형으로, 3자리만 사용한다.

 

VARCHAR가 CHAR보다 공간을 효율적으로 운영할 수 있지만, MySQL 내부적으로 성능 면에서는 CHAR로 설정하는 것이 조금 더 좋다. 그리고 CHAR는 글자의 개수가 고정된 경우, VARCHAR는 글자의 개수가 변동될 경우에 사용하는 것이 좋다.

 

회원 테이블의 문자형을 확인해보겠다.

 

회원아이디는 BLK, APK, GRL 등 3글자로 입력되는데, 데이터 형식은 CHAR(8)로 설정되어 있다. 향후 더 긴 회원 아이디를 만들 수 있다고 가정하고 CHAR(8)로 설정했다. 국번 연락처는 정수형으로 지정하면 앞의 0이 사라지기에 CHAR로 지정했다.

전화번호 역시 모두 숫자로 이루어져 정수형으로 지정해야 할것 같다. 숫자로서의 의미를 가지려면 다음 2가지 중 하나는 충족되어야 한다.

  • 더하기, 빼기 등의 연산에 의미가 있다.
  • 크다, 작다 또는 순서에 의미가 있다.

전화번호는 위 2가지 중 어떤 것에도 해당되지 않는다. 따라서 숫자가 아닌 문자로 지정했다.


 

 

 

대량의 데이터 형식

문자형인 CHAR는 최대 255까지, VARCHAR는 최대 16383자까지 지정이 가능하다. 다음과 같은 테이블을 만들면 오류가 발생한다.

 

열의 길이를 너무 크게 설정했다는 오류이다. 더 큰 데이터를 저장하려는 다음과 같은 형식을 사용한다.

 

 

TEXT로 지정하면 최대 65535까지, LONGTEXT로 지정하면 최대 약 42억까지 저장된다. 이렇게 많은 글자를 저장할 일이 있을까? 생각할 수도 있지만, 소설이나 영화 대본과 같은 내용을 저장한다면 필요한 데이터 형식이다.

또 BLOB라는 용어가 등장했는데 BLOB는 Binary Long Object의 약자로 글자가 아닌 이미지, 동영상 등의 데이터라고 생각하면 된다. 이런 것을 이진(Binary) 데이터라고 부른다. 테이블에 사진이나 동영상과 같은 것을 저장하고 싶다면 BLOB나 LONGBLOB로 데이터 형식을 지정해야 한다.

 

예를 들어, 넷플릭스와 같은 동영상 사이트라면 다음과 비슷한 테이블을 운영할 것이다.

 

테이블은 다음과 같이 만들 수 있다.

 

다른 열은 정수형이나 문자형으로 지정하면 되지만, 자막(movie_script) 열은 LONGTEXT, 동영상(movie_file) 열은 LONGBLOB로 설정해야 대용량의 텍스트와 이진 데이터를 저장할 수 있다. LONGTEXT 및 LONGBLOB로 설정하면 각 데이터는 최대 4GB까지 입력할 수 있다.


 

 

 

 

실수형

실수형은 소수점이 있는 숫자를 저장할 때 사용한다.

 

FLOAT와 DOUBLE은 거의 비슷하다. 소수점 아래를 어디까지 정밀하게 표현하는지의 차이인데, 과학 기술용 데이터가 아닌 이상 FLOAT면 충분한다. 예를 들어 시력은 2.0, 1.5, 0.7 등과 같이 나 오므로 FLOAT로 설정하는 것이 적합하다.

 

날짜형

날짜형은 날짜 및 시간을 저장할 때 사용한다.

 

DATE는 날짜만, TIME은 시간만 저장한다. 날짜와 시간을 둘 다 저장하고 싶다면 DATETIME을 사용한다.


 

 

 

 

변수의 사용

SQL도 다른 일반적인 프로그래명 언어처럼 변수를 선언하고 사용할 수 있다. 변수의 선언과 값의 대입은 다음 형식을 따른다.

SET @변수이름 = 변수의 값 ;  -- 변수의 선언 및 값 대입
SELECT @변수이름 ;	    -- 변수의 값 출력

 

변수는 MySQL 워크벤치를 재시작할 때까지는 유지되지만, 종료하면 없어진다. 그러므로 임시로 사용한다고 생각하면 된다. 다음 예를 살펴보자.

 

 

변수를 선언하고 정수 또는 실수를 대입했다. myVar1을 출력하니 5가 잘 출력되었다.

 

 

두 변수끼리 연산한 후 출력했다. myVar2가 실수형이니 실수의 값이 출력되었다.

 

 

 

 

 

 

하지만 책과 달리 몇 번을 시도해도 아무것도 출력이 되지 않고 있다. 여기서부터는 많이 어려워서 잘 모르겠다. ㅌ

 

테이블을 지워도 계속 오류가 뜨고, 워크벤치를 실행할 때마다 이상한 오류가 뜬다.

 

 

1시간 반이 넘도록 고민해보았으나 결국 해결하지 못했다. 작업 공간을 모두 삭제했고 설정을 변경해주었음에도 되지 않았다. 아무튼 당분간 MySQL은 학습하기 어려울 듯하다.

 


 

 

 

학습을 마치고

오늘은 문제가 생겨서 공부를 하다가 끝까지 마무리하지 못했다. 이럴 때 난 가장 화가 나고 마음이 찝쪕함이 남는다. 하지만 모든 학습은 완벽할 수는 없다. 어제 깨닫지 못한 것을 오늘을 깨닫게 되고, 문제가 있기에 해결하기 위해 애쓰는 것이 우리의 삶이다.

어쨌듯 오늘의 MySQL 공부는 여기서 마치고 나머지 시간 동안에는 내가 하고 싶은 다른 공부를 진행하려고 한다.