메뉴 닫기

Mysql 언어셋을 UTF8로 했을 때 한글 깨짐 현상 해결

Mysql 동작을 이해하려고 인터넷을 이리저리 찾아가면서 공부하던 중에 칼럼(column)에 입력한 필드값이 깨지는 현상을 발견하게 되었습니다.

 msyql1 2015-08-10 14:29:39

**위와 같이 name 칼럼에 작성된 데이터가 깨지는 문제를 볼 수 있습니다.**

제 성격이 쓸때없는 곳에 집착하기와 작은일도 크게 만들기에 한번 찾아서 해결해 보기로 했습니다.

(원인을 해결하기 위해서 여기저기 찾아다니며 ‘언어셋 변경’ 부터 ‘접속 클라이언트 변경’ 까지 따라해 보았으나 해결되지 않았으므로 중간 과정은 생략하도록 하겠습니다.)

 

name칼럼에는 분명히 ‘김영찬’이라는 데이터를 입력했는데 출력값이 ‘김�’ 가 되어 언틋 추측 해본 다는 것이 한글은 2byte(라고 어디서 주워 들어본 적이 있음).

 

그렇다면 제가 추측한 것이 과연 맞는 답일까요?

저는 아래와 같이 스키마를 정의하였고,

 mysql2 2015-08-10 14:43:04 

Name의 데이터타입은 char를 써서 4라는 이미 값을 주었습니다. 

4라는 숫자가 byte를 의미한다면 과연 출력된 필드값(김�)이 맞을까요?

 

한글 한글자=2Byte 

‘김영’ 이라는 필드값이 나와야 정상입니다.

 

하지만 좀더 집착해보기로 하고 나름 구글링을 해보았고 한 블로거가 쓴 한문장을 발견했습니다.

** 참고로MySQL에서는 UTF-8일 경우 한글은 3Byte, 영어는 1Byte로 처리하네요 ^^

 

즉, char는 0부터 255까지의 글자(영문 기준)를 입력 받을 수 있습니다. 예를들어 5라는 숫자를 주면 알파벳 26글자를 써도 입력된 값은 abcde가 됩니다. 그러나 한글은 한글자당 3Byte를 차지 하기 때문에 ‘김’만 정상적으로 출력된 것이 당연하다는 겁니다.

 

다시 계산해 보기로 합니다.

한글 한글자=3Byte

확실하게 하기 위해 table을 삭제하고 데이터타입을 char만 써서 테스트해보기로 했습니다.

mysql3 2015-08-10 14:56:54 

여기서 데이터타입 char에 값을 4,5,6,7,8,9로 준 이유는 ‘한글 입력시 출력되는 값을 비교’하기 위해서 입니다.

 

자 위와 같이 정의하고 INSERT문을 써서 데이터를 입력해보기로 합니다.

 

INSERT INTO `study` VALUES (‘김영찬’,’김영찬’,’김영찬’,’김영찬’,’김영찬’,’김영찬’);

 

 mysql4 2015-08-10 15:02:06 

쿼리문을 입력해보니 다음과 같은 출력값이 나왔습니다.

저는 UTF-8로 세팅된 mysql은

데이터타입에 문자길이는 영문 기준으로 1Byte이므로 한글 입력시 한글자당 3Byte로 계산하여 정의 해줘야 한다는 결론을 얻었습니다.

 

이상입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다