MySQL 한글 깨짐 문제

문제

JPA를 이용해 데이터베이스에 INSERT시 한글이 ???로 깨져서 저장이 되는 문제가 발생함.
에러가 발생한 환경은 Spring boot JPA + MySQL(ubuntu of EC2)

해결

Datasource URL에 인코딩 속성 적용

jdbc:mysql://URL?useSSL=false&useUnicode=true&characterEncoding=utf8

그러나, INSERT시 다음과 같은 오류가 발생

java.sql.SQLException: Incorrect string value: ‘\xEC\x84\x9C\xEC\x9A\xB8…’ for column ‘address’ at row 1

근본적으로 DB의 캐릭터셋을 변경해야함.

추가 DB설정

MySQL에서 명시적으로 캐릭터셋을 설정하지 않으면 기본 캐릭터셋이 적용됨 -> latin1
MySQL의 config 파일(my.cnf)에 인코딩 속성을 적용해줘야한다고 함.

  1. whereis mysql (MySQL의 config 파일 위치 찾기)
  2. cd /etc/mysql (my.cnf파일이 있는 폴더로 이동)
  3. sudo vi my.cnf (root 권한으로 아래 내용을 설정파일의 제일 밑에 입력 후, 저장)

[mysql]
default-character-set = utf8

[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect=’SET NAMES utf8’

  1. sudo service mysql(mysqld) restart (MySQL 서비스 재시작)
  2. 설정이 끝났으면 캐릭터셋을 확인하기 위해 MySQL에 접속해 다음의 명령어를 입력.
status;

또는,

SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'collation%';

utf-8로 되어있으면 캐릭터셋 설정 완료.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이미 생성된 테이블은 생성 당시의 캐릭터셋으로 만들어져 있기 때문에 추가적으로 테이블의 캐릭터셋을 변경해야함.

1.생성된 테이블의 정보 확인. (테이블 정보 제일 밑에 DEFAULT CHARSET이 표시됨)

SHOW CREATE TABLE table_name;

2.utf-8로 테이블의 캐릭터셋 변경.

ALTER TABLE table_name CONVERT TO character SET utf8;

3.1번 명령어로 변경되었는지 확인.


참고문서