문제
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)에 인코딩 속성을 적용해줘야한다고 함.
- whereis mysql (MySQL의 config 파일 위치 찾기)
- cd /etc/mysql (my.cnf파일이 있는 폴더로 이동)
- 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’
- sudo service mysql(mysqld) restart (MySQL 서비스 재시작)
- 설정이 끝났으면 캐릭터셋을 확인하기 위해 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번 명령어로 변경되었는지 확인.