無테고리 인생살이

MySQL 테이블에 한글 insert 실패 원인와 해결 방법 (feat. Incorrect string value : '\xEC..) 본문

gift-card-flea-market

MySQL 테이블에 한글 insert 실패 원인와 해결 방법 (feat. Incorrect string value : '\xEC..)

無격 2023. 6. 24. 16:43
  • 에러 발생 과정
  • 발생 에러 (Incorrect string value : '\xEC..)
  • 원인
  • 해결 방법

 

 

Ubuntu 원격 서버에 MySQL 서버 설치 & 외부에서 Workbench로 DB 접속

원격 서버 준비 원격 서버에 MySQL 설치 외부에서 MySQL 접속 Ubuntu 원격 서버에 MySQL 설치를 위한 준비 네이버 클라우드 플랫폼에서 리눅스 ubuntu-18.04 버전의 서버를 설치했습니다. 터미널 프로그램

chunsubyeong.tistory.com

이전 글에서 Ubuntu 원격 서버에 MySQL 설치 및 외부 접속을 진행하였습니다.

 

에러 발생 과정

위 과정이 완료되고 프로젝트에 필요한 더미데이터를 추가하기 위해,

로컬 Workbench로 MySQL DB 서버에 접속한 뒤 진행 중인 프로젝트의 ERD를 기준으로 아래와 같이 데이터베이스, 테이블 생성하였습니다.

 

데이터베이스, 테이블 생성

 

생성한 category 테이블에 아래와 같이 더미데이터를 insert 하는 과정에서 에러가 발생했습니다.

더미데이터 insert -> 실패

발생 에러

Incorrect string value : '\xEC\xB9\x98\xED\x82\xAC...' for column 'name'

 

원인

'카페, 치킨..' 등의 한글 문자열이 '\xEC\xB9\..' 로 형태가 바뀌었으므로, 인코딩 관련 에러인 것을 알 수 있습니다.

 

구글링을 해본 결과 MySQL의 default character set은 버전마다 다르다고 합니다.
(MySQL 5.7 이하 : latin1 / MySQL 8 : utf8mb4)

원격 접속 프로그램인 PuTTY로 원격 서버에 설치된 MySQL 버전과 기본 캐릭터 셋을 확인해 보겠습니다.

1. MySQL 버전 확인

version : 5.7.42

2. MySQL default character set 확인

default character set : latin1


=> MySQL 5.7 버전이라 당연히 기본 캐릭터 셋은 latin1이었고, 이게 한글 문자열 insert 에러의 원인이었던 것 !

 

해결 방법

1. 데이터베이스 DROP 후, 다시 생성

create database 데이터베이스명 character set utf8mb4 collate utf8mb4_unicode_ci;
  • 테이블에 데이터가 많이 없는 경우 사용합니다.
  • 생성되는 테이블들은 utf8mb4 캐릭터 셋이 자동 적용됩니다.

2. 데이터베이스 캐릭터 셋 수정

alter database 데이터베이스명 character set utf8mb4 collate utf8mb4_unicode_ci;
alter table 테이블명 convert to character set utf8mb4 collate utf8mb4_unicode_ci;
  • 테이블에 이미 많은 데이터가 존재할 경우 사용합니다.
  • 데이터베이스 캐릭터 셋을 수정해도 이미 존재하는 테이블에 자동 적용되지 않기 때문에, 테이블도 동일하게 수정해야 합니다.

3. MySQL 설정 파일에서 기본 캐릭터 셋 수정

주의※ : 운영체제에 따라 MySQL의 설정 파일이 위치하는 디렉토리와 파일명이 다릅니다. (Ubuntu, MySQL 5.7 기준으로 설명)

 

3-1. 설정 파일 불러오기 (vi /etc/mysql/mysql.conf.d/mysqld.cnf)

3-2. 아래 내용 추가

[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
skip-character-set-client-handshake

3-3. mysql 재시작 (service mysql restart)

3-4. 캐릭터 셋 수정 확인

캐릭터 셋 변경됨