mySql varchar 타입 질문이 있습니다. 0 5 7,801

by 김쿠쿠 [MySQL] [2019.05.14 09:51:46]


varchar(50)으로 설정된 컬럼이 있는데,

예외처리 미흡으로 50byte이상이 되는 값들이 대거 저장 되었습니다.

오라클에서는 선언한 length 이상의 값이 저장되는 경우는 없었던 것 같은데,

mySql에서는 50byte이상 되는 값들도 저장이 되더군요.

대충 검색해 보니 파편화(?) 라고 표현하던데.. 이렇게 넘치게 써도 되는지 궁금합니다.

아니면 지금이라도 varchar(50)을 varchar(100) 등으로 늘리는게 좋을까요? 아니면 그냥 이대로 사용해도 될까요?

조언을 부탁드립니다.

by 마농 [2019.05.14 11:03:33]

MySQL 에서의 varchar(50) 은 50 Bytes 가 아닌 50 Characters 를 의미합니다.
varchar(50) 으로 선언하고 Check 제약조건으로 byte 체크하세요.
단, 체크 제약을 설정하려면 기존 길이 초과된거 50 Byte 로 갱신 후에 처리하세요.
ALTER TABLE test ADD CONSTRAINT chk_test_v50 CHECK (LENGTHB(col) <= 50);


by 김쿠쿠 [2019.05.14 11:26:50]

앗... 50 Character를 의미하는거라면, varchar(50)은 한글 50자가 들어가도 문제 없다는 뜻인가요?!!

지금까지 한글 1글자 3byte로 생각해서.. 해당 컬럼 예외처리 한글 16글자 까지 처리 했는데.. 그러면 굳이 예외처리를 할 필요가 없어지는 상황 같습니다만...


by 르매 [2019.05.14 12:32:41]

@김쿠쿠
네, byte가 아닌 글자 수 기준입니다. varchar(50) 은 영문이던 한글이던 중국어이던.. 최대 50자까지 들어갑니다.
단, 영문이 50자 들어가면 50byte이고.. 한글이 50자 들어가면 150byte가 되겠죠.

그래서 주의가 필요한 부분이 있는데.. create table 문에서 컬럼이 varchar인 경우 사용할 수 있는 최대 글자 수가 캐릭터 셋마다 다르다는 점입니다.

데이터 유형으로만 보면.. varchar에 사용할 수 있는 문자열은 최대 64KB지만, utf8이면 1/3, utf8mb4이면 1/4까지만 사용할 수 있죠.

예) utf8mb4에서 create table t (col varchar(16383)); 과 같이 64KB의 1/4인 16383 보다 큰 수를 넣을 수 없어서.. 이보다 큰 값을 넣으면 에러가 납니다.


by 김쿠쿠 [2019.05.14 12:59:13]

앗 두분다 답변채택 해드리려 했는데.. 한분만 되는군요.. 두분다 도움과 가이드 주셔서 감사합니다. ( _ _ )

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입