MySQL에 INSERT 작업을 하면 한글이 ???로 깨져서 저장이 되거나, incorrect string value: '\xE3\x84\xB4\xE3\x85\x87...' for column과 같이 INSERT가 안될때가 있습니다.
이런 경우는 주로 데이터베이스의 인코딩 타입이 UTF-8로 제대로 설정이 안되서 발생하는 에러입니다.
이번 포스팅에서는 Windows에서 MySQL 한글 깨짐 문제의 원인인 character_set을 UTF-8로 변경하는 것을 다뤄보겠습니다.
MySQL은 모두 설치되어 있다고 가정하고 본 포스팅에서는 character_set을 UTF-8로 변경만 하겠습니다.
1. MySQL character_set을 검색하기
아래와 같이 c로 시작하는 것들을 검색해보면 다음과 같이 character_set 관련 설정이 나옵니다.
현재 저는 character_set_* value가 모두 utf8로 설정이 되어있습니다.
utf8로 설정이 되어 있지 않은 분들은 my.ini 파일을 수정해줍니다.
SHOW VARIABLES LIKE 'c%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
| check_proxy_users | OFF |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| core_file | OFF |
+--------------------------+---------------------------------------------------------+
16 rows in set, 1 warning (0.01 sec)
2. my.ini 설정 파일
my.ini는 MySQL엔진에서 사용하는 환경 설정파일입니다. my.ini파일에 utf8설정을 해보겠습니다.
2.1 my.ini 파일 경로 찾기
MySQL my.ini파일은 보통 MySQL basedir 하위에 존재합니다. 그렇지만, MySQL을 윈도우 플랫폼인 .msi installer로 설치한 경우에는 my.ini파일의 경로는 %PROGRAMADATA% 디렉터리 하위에 만들어집니다.
2.1.1 .msi 인스톨러로 설치하지 않은 경우
자신의 basedir 즉 MySQL Server가 설치된 경로가 나옵니다.
SHOW VARIABLES WHERE Variable_Name LIKE "%dir%";
+-----------------------------------------+---------------------------------------------------------+
| Variable_name | Value |
+-----------------------------------------+---------------------------------------------------------+
| basedir | C:\Program Files\MySQL\MySQL Server 5.7\ |
| binlog_direct_non_transactional_updates | OFF |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
| datadir | C:\ProgramData\MySQL\MySQL Server 5.7\Data\ |
| ignore_db_dirs | |
| innodb_data_home_dir | |
| innodb_log_group_home_dir | .\ |
| innodb_max_dirty_pages_pct | 75.000000 |
| innodb_max_dirty_pages_pct_lwm | 0.000000 |
| innodb_tmpdir | |
| innodb_undo_directory | .\ |
| lc_messages_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\ |
| plugin_dir | C:\Program Files\MySQL\MySQL Server 5.7\lib\plugin\ |
| slave_load_tmpdir | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp |
| tmpdir | C:\WINDOWS\SERVIC~1\NETWOR~1\AppData\Local\Temp |
+-----------------------------------------+---------------------------------------------------------+
15 rows in set, 1 warning (0.01 sec)
2.1.2 .msi 인스톨러로 설치한 경우 my.ini 파일 경로
이번에는 mysql command line이 아닌 cmd를 켜줍니다.
아래 경로를 파일 탐색기를 통해서 들어갑니다. Windows + E 키를 눌러주면 파일 탐색기가 나옵니다.
echo %PROGRAMDATA%
# 아래와 같이 해당 경로가 나옵니다.
C:\ProgramData
2.1.3 파일 탐색기로 my.ini 경로에 들어갑니다.
아래와 같이 C -> ProgramData -> MySQL -> MySQL Server 5.7 -> my.ini 파일이 있습니다.
my.ini 파일이 보이지 않으시면 상단의 네비게이션에 보기를 눌러서 숨긴 항목을 체크해주시면 보입니다.
2.1.4 my.ini 파일에 [client], [mysql], [mysqld]를 찾아서 아래의 코드를 복사 붙여넣기 합니다.
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
각각의 항목에 형광색 항목을 넣어줍니다. 이제 새로운 데이터베이스들에는 해당 변경사항이 적용이 되었지만, 기존에 데이터베이스와 테이블을 만들었다면 MySQL Command Line에 들어가서 변경을 해줍니다.
2.2 기존에 생성한 데이터베이스와 테이블의 캐릭터셋을 utf8로 변경하기
해당 설정을 변경하고나면 MySQL의 서비스를 재시작해야 합니다.
-- 데이터베이스 검색
SHOW databases;
-- 데이터베이스 선택
-- USE 테이터베이스명
USE test;
-- 기존에 생성한 데이터베이스 캐릭터셋 UTF8로 변경
-- ALTER DATABASE 데이터베이스명 DEFAULT CHARACTER SET UTF8;
ALTER DATABASE test DEFAULT CHARACTER SET UTF8;
-- 기존에 생성한 테이블 캐릭터셋 UTF8로 ㅂ녀경
-- ALTER TABLE 테이블명 CONVERT TO CHARACTER SET UTF8;
ALTER TABLE test_table CONVERT TO CHARACTER SET UTF8;
2.3 MySQL 서비스 재시작
- Windows + E 를 눌러서 파일 탐색기를 키고 내 PC -> 관리를 눌러줍니다.
- 서비스 및 응용 프로그램 -> 서비스를 누르면 우측에 서비스 항목들이 나옵니다.
- 이름을 누르고 M 을 입력하면 m으로 시작하는 항목이 나옵니다. 우 클릭해서 다시시작을 해줍니다.
2.4 MySQL Commnad Line에서 변경되었는지 확인하고 데이터 삽입하기
기존에 character_set_*으로 시작하는 변수의 Value가 utf8로 변경되는것을 확인하실 수 있을 겁니다.
SHOW VARIABLES LIKE 'c%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
| check_proxy_users | OFF |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| core_file | OFF |
+--------------------------+---------------------------------------------------------+
16 rows in set, 1 warning (0.00 sec)
2.4.1 test 테이블을 생성하고 한글이 들어가는지 확인해보기
아래와 같이 정상적으로 한글이 들어가는 것을 볼 수 있습니다.
-- test 데이터베이스 생성
CREATE DATABASE test;
-- test 테이블 생성
CREATE TABLE test (
test VARCHAR(20)
);
-- test 테이블에 데이터 삽입
INSERT INTO test VALUES('한글 테스트입니다.');
-- test 테이블 데이터 툴력
SELECT * FROM test;
+----------------------------+
| test |
+----------------------------+
| 한글 테스트입니다. |
+----------------------------+
1 row in set (0.00 s