작성
·
387
·
수정됨
4
안녕하세요 먼저 좋은 강의 감사드립니다.
CHAR vs VARCHAR를 수강하던 중 궁금한 점이 생겨 질문 남깁니다!
1. CHAR의 경우 미리 공간을 할당해두기 때문에 update 시 파편화되는 부분이 없지만,
VARHAR의 경우 길이가 더 길게 update 시 처음 레코드가 저장되었던 공간은 delete marking 후에 새롭게 빈 공간에 레코드를 저장하는 것으로 이해했습니다.
그렇다면 VARCHAR에서 길이가 더 짧거나 길이가 같게 update를 하는 경우는 어떻게 동작하는걸까요?
UTF8MB4 CHAR 경우 미리 할당된 데이터 보다 더 큰 데이터를 업데이트 하게 된다면 VARCHAR 처럼 처음 레코드가 저장되었던 공간은 delete marking후 새롭게 빈 공간에 레코드를 저장하게 되는걸까요? 예시 : CHAR(10)에 '한글'을 저장했다가, '한글 연습'을 업데이트 하는 경우 VARCHAR 처럼 동작하는지가 궁금합니다.
답변 1
3
안녕하세요.
1번 : 레코드의 길이가 부족하지 않기 때문에, 다른 위치로 옮겨지지 않고 그 자리에 업데이트됩니다.
2번 : CHAR 타입의 길이가 얼마냐에 따라서 다릅니다. 동영상 강의 내용의 예제에서 언급했던 CHAR(10) 타입의 경우, "한글"을 저장하면 6바이트를 사용하고 4바이트는 비워두지만, "한글연습"으로 업데이트되면 12바이트가 필요해져서, 최종적으로는 다른 위치로 레코드가 옮겨지게 됩니다. 만약 "한글"에서 "한글날"로 업데이트되면 9바이트만 필요하기 때문에 위치가 옮겨지지 않고 그 자리에 그대로 업데이트될 수 있을 것으로 보여요.
감사합니다.
안녕하세요 2번 답변에 추가적으로 질문이 있어 답변드립니다.
UTF8MB4 문자형식을 사용한다면, CHAR 타입임에도 불고하고, 다른 레코드로 옮기지는 현상이 종종 일어날 수 있다고 이해하였습니다.
UTF8MB4 문자형식을 사용한다면, CHAR 타입 형식을 사용하는것은 CHAR 사용시의 장점이 조금 줄어든다고 생각되었습니다.
일반적으로 UTF8MB4문자 형식 사용시에는 VARCHAR만을 사용할까요? 혹은 종종 레코드 옮김 현상이 있음에도 불구하고 CHAR타입을 사용하는게 맞을지 질문드립니다.
시바견님, 안녕하세요.
일반적으로 UTF8MB4문자 형식 사용시에는 VARCHAR만을 사용할까요? 혹은 종종 레코드 옮김 현상이 있음에도 불구하고 CHAR타입을 사용하는게 맞을지 질문드립니다.
UTF8MB4 문자 셋의 CHAR 타입을 사용하더라도, 영문 숫자만 저장하는 경우에는 고정 길이 문자열을 사용할 때와 같이 CHAR 타입의 장점을 100% 가지게 됩니다. 그리고 그렇지 않다 하더라도, 공간 낭비가 심하지 않다면 CHAR 타입을 사용하는 것이 좋아 보입니다. CHAR 타입은 (공간낭비를 배제하면) 최악의 경우 VARCHAR와 같은 방식으로 작동하는 것이기 때문에요.
감사합니다.
감사합니다!