MySQL 테이블의 특정 필드에 한글을 insert하다보면 아래와 같은 에러가 발생하는 경우를 만날수 있다.

ERROR 1366 (HY000): Incorrect string value: ...


kkk라는 테이블이 아래와 같은 형식으로 생성되어 있다고 가정하면,


mysql> show create table kkk;

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                                             |

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

| kkk   | CREATE TABLE `kkk` (

  `bdid` bigint(11) unsigned NOT NULL,

  `name` varchar(80) NOT NULL,

  PRIMARY KEY (`bdid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)


위와 같이 kkk라는 테이블이 있을 경우 DEFAULT CHARSET=latin1으로 되어 있다.

이때 한글을 name 필드에 insert하게 되면 아래와 같은 에러가 발생한다.


mysql> insert into kkk (bdid, name) values (1, '한글입력');

ERROR 1366 (HY000): Incorrect string value: '\xED\x95\x9C\xEA\xB8\x80...' for column 'name' at row 1


이 문제 해결을 위해서는 default character set을 utf8로 변경해 주면 깨끗이 해결된다.

kkk라는 테이블을 생성하는 DDL 문에서 아예 utf8로 설정해서 테이블을 생성해 주면 된다.

다음과 같이


CREATE TABLE `kkk` (

  `bdid` bigint(11) unsigned NOT NULL,

  `name` varchar(80) NOT NULL,

  PRIMARY KEY (`bdid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;



Database의 DB table이 생성되어 있을 때 이들 table 생성시 사용했던 DDL(Data Definition Language)를 보고 싶을 경우가 있다.

한마디로 이미 생성되어 있는 DB table들의 DDL을 뽑아내는 방법에 대한 것이다.


명령어 구문은(MySQL에 접속한 상태에서)


mysql> show create table 테이블명;


mysql> show create table kkk;

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                                             |

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

| kkk   | CREATE TABLE `kkk` (

  `bdid` bigint(11) unsigned NOT NULL,

  `name` varchar(80) NOT NULL,

  PRIMARY KEY (`bdid`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)


kkk라는 테이블을 생성한 DDL 구문이다.


여기서 ENGINE의 종류는 InnoDB이다. MySQL의 경우 2가지 엔진 타입이 있는 InnoDB와 MyISAM이 있다.

InnoDB의 경우는 빈번한 쓰기, 수정, 삭제가 발생할 경우 유리하고

MyISAM은 InnoDB에 비해 상대적으로 성능이 높은 편인데 주로 읽기 위주의 처리에 높은 성능을 발휘한다.

반면에 MyISAM은 빈번한 쓰기, 수정, 삭제가 발생하는 경우라면 오히려 InnoDB보다 성능이 못하다고 한다.

정답은 상황에 맞게...


여기서 또 한가 주목할 부분은 DEFAULT CHARSET=latin1을 되어 있다.

이럴 경우 한글을 insert할 때 에러가 발생한다.

이 문제에 대한 해법은 다음 링크 참조.


default charset과 한글 입력 문제




+ Recent posts