본문 바로가기
IT지식/개발

[mysql] DB에 한글이 insert 안 될 때 테이블의 charset를 변경하세요.

by 7$ 2020. 2. 13.

웹 서버에 글쓴이를 추가하는 기능을 만들었다.

한글을 입력 후 insert 시도하면 저장이 안 된다.

sql문도 문제가 없고, 에러 메시지도 발생하지 않았다.

영어를 입력하면 저장이 잘 된다.

캐릭터 셋 문제인가보다.

Author 테이블의 캐릭터셋을 확인해보자.

mysql> SHOW CREATE TABLE author;
+--------+----------------------------------------------------+
| Table  | Create Table                                       |
+--------+----------------------------------------------------+
| author | CREATE TABLE `author` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`profile` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 |
+--------+----------------------------------------------------+
1 row in set (0.00 sec)

CHARSET=latin1 으로 되어있다..

 

utf8로 변경하자.

mysql> ALTER TABLE author CONVERT TO CHARACTER SET utf8;

Query OK, 6 rows affected (0.06 sec)
Records: 6  Duplicates: 0  Warnings: 0

다시 테이블 정보를 확인해보자

mysql> SHOW CREATE TABLE author;
+--------+----------------------------------------------------+
| Table  | Create Table                                       |
+--------+----------------------------------------------------+
| author | CREATE TABLE `author` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`profile` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 |
+--------+----------------------------------------------------+
1 row in set (0.00 sec)

CHARSET=utf8로 변경되었다.

 

이제 다시 한글이 저장되는지 확인해보자.

저장이 되었다.

 

그럼 이제 mysql의 캐릭터 셋이 기본으로 utf8로 생성되도록 my.cnf 설정을 바꿔보자.

 

현재 데이터베이스의 상태를 확인한다.

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper

Connection id:		
Current database:	
Current user:		@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.29-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/var/run/mysqld/mysqld.sock
Uptime:			15 days 3 hours 43 min 37 sec

--------------

Server characterset : latin1

Db characterset : latin1

으로 설정되어 있다. mysql을 설치 시 latin1이 기본값이다.

 

(우분투 aws ec2)터미널에서 /etc/my.cnf 파일을 열고 아래 문장을 추가한다.

[mysql]
default-character-set = utf8
 
[mysqld]
character-set-client-handshake=FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8
collation-server = utf8_general_ci
  
[client]
default-character-set = utf8

mysql을 재실행 한다.

$ service mysqld restart

 

새로운 데이터베이스를 생성해 확인해보자.

mysql> CREATE DATABASE newdb;
mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.29, for Linux (x86_64) using  EditLine wrapper

Connection id:		
Current database:	newdb
Current user:		@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.29-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/var/run/mysqld/mysqld.sock
Uptime:			15 days 3 hours 43 min 37 sec

--------------

 

모두 utf8로 변경되었다.

끝.