본문 바로가기

Tips

MySQL character encoding 에러

mysql 에서 한글값이 포함된 쿼리 실행시(insert / update) 아래와 같은 오류가 발생하는 경우에는 mysql character set 설정을 확인해 보아야 한다. 

  Error Code: 1366. Incorrect string value:

다음의 항목에 대해 확인 및 수정이 필요하다. 
  • 테이블 설정
  • 데이터 베이스 설정값
  • mysql 설정 수정 (my.cnf or my.ini)
설치 환경에 따라 전부 조치가 필요할 수도 있고, 작게는 테이블 character set 설정만 수정해도 된다. 

테이블 character set 확인

mysql client 를 실행한 뒤 다음 명령으로 해당 테이블의 character set 을 확인한다. 

show create table ‘테이블명’;

e.g. 결과 값을 확인해 보면 해당 테이블에 설정된 character set 을 확인할 수 있다 .




위 예에서는 latin1 으로 설정된 것을 알 수 있다.  

이제 이 테이블의 character set 을 바꿔보자. 보통 unicode 지원을 위해 utf8 으로 설정한다. 

alter table xxxxxxx(table명) convert to character set utf8;

데이터베이스 character set 설정 확인

다음 명령어를 실행하여 mysql 설정값들 중 character set 설정값을 확인한다. 

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

이 값들은 mysql config 파일을 수정 한 뒤, mysql 을 재시작하면 된다. 

$sudo vi /etc/mysql/my.cnf 

아래 내용을 추가한다. 아무 설정이 없을 경우 아래 내용을 그대로 추가하면 되고, 해당 섹션에 다른 설정이 있을 경우에는 character-set 설정들만 추가한다. 

[client]
#하단추가
default-character-set = utf8

[mysqld]
#하단추가
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8" default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci

[mysqldump]
#하단추가
default-character-set = utf8

[mysql]
#하단추가
default-character-set = utf8

저장 후 , mysql 을 재시작한다. ( $sudo service mysql restart )

mysql client 로 접속하여 다시 mysql 설정값들을 확인 한다. 

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| 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       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)



Reference