MS 윈도우에 MySQL 을 기본 설치한 후, MySQL DB 에 한글 utf8 문자열 INSERT 할 때에 오류가 발생하는 문제를 해결 방법은 다음과 같습니다.
* 테이클의 default charset 을 utf8 로 설정한다.
- 테이블의 default charset 을 utf8 로 설정하여서 생성하는 SQL 문 예제는 다음과 같다.
CREATE TABLE noticeboard (
`nbId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nbSubject` varchar(255) NOT NULL,
`nbContent` text NOT NULL,
`nbReadCount` int(10) unsigned NOT NULL DEFAULT '0',
`nbInsertDate` datetime NOT NULL,
PRIMARY KEY (`nbId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
* MySQL DB 연결시 character-set 을 "utf8" 로 설정한다.
- MySQL Client API 에서는 MySQL DB 연결된 후, character-set 을 "utf8" 로 수정한다.
- MySQL JDBC 에서는 MySQL url 에 아래와 같이 utf8 을 설정한다.
jdbc:mysql://127.0.0.1:3306/spring?useUnicode=yes&characterEncoding=UTF-8
위와 같이 설정하시면 MySQL 서버의 my.ini 파일을 수정하지 않으셔도 정상적으로 utf8 문자열이 저장되는 것 같습니다. 아래의 그림은 위와 같이 설정한 상태에서 MySQL C API 및 MySQL JDBC 로 utf8 한글을 입력한 결과입니다.
위와 같이 설정하여도 MySQL DB 에 utf8 문자열 INSERT 오류가 발생한다면 테이블 컬럼의 charset 을 확인해 보세요. 즉, 아래와 같이 nbSubject 컬럼에 "CHARACTER SET latin1" 으로 설정되어 있다면 nbSubject 컬럼에 utf8 문자열을 입력시 오류가 발생하게 됩니다. 이 경우에는 컬럼에 설정된 "CHARACTER SET latin1" 항목을 모두 제거하면 정상적으로 utf8 문자열이 INSERT 됩니다.
CREATE TABLE noticeboard (
`nbId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nbSubject` varchar(255) CHARACTER SET latin1 NOT NULL,
`nbContent` text CHARACTER SET latin1 NOT NULL,
`nbReadCount` int(10) unsigned NOT NULL DEFAULT '0',
`nbInsertDate` datetime NOT NULL,
PRIMARY KEY (`nbId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;