Programming/SQL

NVARCHAR, DDL중 ALTER 로 테이블 변경 2021-07-20

최동훈1 2021. 7. 20. 16:26

이전 포스트에서는, CHAR 형의 파라미터에 들어가는 것은 size나 2 CHAR 처럼 해당 DBMS가 정하고 있는 유니코드의 글자당 바이트 수가 들어갈수 있다고 했다. 이것은 CHAR 나 VARCHAR 만 한정된 것이고 나머지는 다 size 만 들어간다고 알고 있었다. 그러나 오늘 MEMBER 테이블을 수정할 일이 있어서 확인해 보니.

이렇게 되어 있었다. CHAR나  VARCHAR 의 파라미터로 그냥 숫자를 주면, Unicode - 8  인코딩으로 숫자당 1byte 값으로 저장할수 있는 공간이 생기기에, BIRTHDAY나 ID 의 Byte 값은 이해가 됬다. 그런데 PWD 값은 왜 50 CHAR 일까? 분명 nationalcharacterset은 오라클에서 Unicode -16 을 쓰는데, 50 CHAR는 1 CHAR 당 3바이트를 쓰기에 사이즈가 다르지 않나? 이런 생각이 들었다. 

여기서 내 추측 1. 그냥 오라클에서 50 NationalCHAR 이렇게 쓰기 번거로우니 50 CHAR 가 비록 유니코드 표준은 다르지만,  50글자를 나타내는 표현으로 나타낸것 아닐까?

추측 2. 그러면 확인해 보자. 만약 NAME에 '최동훈'이라는 값을 넣고 SELECT 문으로 해당 칼럼의 바이트 값을 뽑아보면, 만약 내 가설이 맞다면, 글자당 2바이트씩 총 6 바이트가 출력 될 것이다.

그렇지 않고 진짜 오라클에서 CHAR 형으로 저장한것이라면(말도 안되지만), 글자당 3바이트씩 9 바이트가 출력될 것이다.

 

나는 내 추측을 입증하기 위해 직접 LENGTHB 함수를 이용해서 해당 칼럼의 바이트 크기를 출력해 보았다.

insert into member(name) values('최동훈') ;
select lengthb(name) FROM member;

결과는 이렇게 나왔다. 3개나 나온 이유는 내가 그 전에 만들어놓은 테이블에 저장된 값이 있었기 때문이다.

결국 내 가설이 맞았다..ㅎㅎ 그냥 오라클에서 NCHAR(50), NVARCHAR(50) 같은 national사이즈도, 일괄적으로 글자수를 표현할때는 50 CHAR 이렇게 표현한다.

 

요약 :  파라미터로 글자수가 올수 있는 것은 CHAR 형 뿐이다. 나머지는 size가 오는데 그 size의 1단위당 byte수가 unicode 에 따라 다르다.

CHAR(SIZE|char), NCHAR (SIZE)

 

-> 요약 쓰다가 또 궁금한점을 발견했다. 그럼 난 여태 까지 '글자 수' 가 오는 문자형은 CHAR, VARCHAR 뿐이라고 생각했는데, 위에 표의 데이터 형을 보니, char, varchar는 오히려 byte로 나오고, nchar,nvarchar는 char 형으로 나왔다. 그럼 내가 여태 거꾸로 생각하는 것일까? 이해하기 쉽게 다시 말하자면, 처음: 문자형의 파라미터로 CHAR형 이 올수 있는 것은 char,varchar 뿐이라 생각하고, nchar나 nvarchar는 사이즈 다시말하면, 바이트 수가 오는 것으로 알고 있었다. 그런데, 그 다음: 오히려, nchar 로 오는 파라미터의 숫자는 진짜 액면가 그대로의 '자리수' 가 오는 것이니, 예를들면, nchar(3)는 한글 3글자를 저장 가능 그러나 char(3)은 한글 1글자 저장 가능 왜냐하면, nchar의 사이즈는 1당 3byte고, char 의 사이즈는 1당 1byte이기 때문. 어? 여기서 답을 찾았다.

둘다 사실 "자릿수" 가 오는 것은 맞다. char형은 원래 영어가기준이라 1byte 가 자리수 하나이기 때문이다. 또 nchar은 2byte가 한 자리이긴 하지만 숫자로 오는 자릿수 인 것은 맞다. 그러나,  영어든 한국어든 중국어든 모든 종류의 언어가 2byte로 규격화된 unicode - 16 에서는 자릿수라 칭해도 상관없지만, 영어 : 1byte, 한글 : 3byte로 나누어진 unicode - 8 을 쓰는 Char 형에서는 자릿수 개념이 아닌 byte값이 오히려 더 바람직하다.

 

정리:

CHAR(50),NCHAR(50) 여기서 각 50은 글자의 size 이다. 즉 "글자의 갯수이다." 그러나 CHAR 형 데이터에 한글을 입력할 경우 에는 50 CHAR 으로 명시해 unicode - 8 의 기준에 맞는 글자의 갯수를 넣어준다.

각 size의 크기는  CHAR 는 1당 1byte. NCHAR 는 1당 2byte이다.

 

오늘은 nchar(size)를 더 공부한다고 강의는 많이 못들었다. 그런데 그나마 테이블의 칼럼을 바꾸는 것을 배웠는데 일단 칼럼을 만들어 보자면,

Create table member(
ID varchar(50),
PWD nvarchar2(50),
name nvarchar2(50),
gender nchar(2),
age number,
birthday char(10),
phone char(13),
regdate DATE
);

 이 쿼리로 member라는 테이블을 만들었다. 그런데 만약 내가 아래의 그림과 같이 테이블 칼럼을 변경하고 싶다면 어떻게 해야 할까?

ALTER table member modify ID nvarchar2(50);
ALTER table member drop column age;
ALTER table member add EMAIL VARCHAR2(200);

이 쿼리를 쓰면 쉽게 테이블을 바꿀수 있다. 그런데.. 사실 DDL은 많이 안쓴다 하더라 왜냐하면 sql developer로 쉽게 클릭 몇번으로 편집할 수 있기 때문이다.

이 member에서 왼쪽 마우스 클릭후 편집 으로 들어가면,

이렇게 테이블을 편집할 수 있는 창이 나오는데 그러면 굳이 DDL 쿼리를 날리지 않아도 쉽게 변경 가능하다.

 

공부시간 4시간.

순공시간 2시간.

 

오늘은 나 스스로 쿼리를 날려보면서 코딩을 직접 많이 해보니, 공부 오래한 기분다.