DB별 varchar(n)의 n 의미

Oracle

varchar2(10) 은 10 byte를 의미한다.
oracle에서 영어는 1byte, 한글은 2byte 이기 때문에 그동안 막연하게 한글이 들어가는 컬럼은 100자 -> varchar2(200) 으로 생성해왔다.

-- 테스트용 테이블 생성
CREATE TABLE test(
	name varchar2(10)
);

-- 한글 10글자를 INSERT
INSERT INTO test values('일이삼사오육칠팔구십');

Query execution failed

Reason:
SQL Error [12899] [72000]: ORA-12899: value too large for column
"TEST"."NAME" (actual: 20, maximum: 10)
-- 10byte 컬럼에 20byte가 들어왔다는 오류 확인



지금까지 잘못 알고 있었다.

-- 테스트용 테이블 생성, 아까와 달리 10 char 로 생성하였다.
CREATE TABLE test(
	name varchar2(10 char)
);

-- 한글 10글자를 insert 하였을때 성공 하는것을 확인 할 수 있다.
INSERT INTO test values('일이삼사오육칠팔구십');

SELECT name FROM test;
-- '일이삼사오육칠팔구십' 이 조회되는 것을 확인 할 수 있다.

varchar2(n char) 에서 char는 byte 와 상관 없이 글자수(length) 인 것을 확인 할 수 있다.

Mysql & MariaDB

oracle에서 varchar2(n) 의 n은 byte 수 인 것을 보고 당연히 모든 DB 는 다 그럴 줄 알고 똑같이 사용해왔다.
찾아보니 mysql 4.1 이상부터는 전부 기본적으로 lenght 라는 내용을 볼 수 있었다.

Mysql, MariaDB 전부 확인한 결과 바이트와 상관없이 길이로 insert가 되었다.

CREATE TABLE test(
	name varchar(10)
);

-- 한글 10글자를 insert 하였을때 성공 하는것을 확인 할 수 있다.
INSERT INTO test values('일이삼사오육칠팔구십');

SELECT name FROM test;
-- '일이삼사오육칠팔구십' 이 조회되는 것을 확인 할 수 있다.