Mysql의 인코딩부분에서 궁금한게 있어서 질문드립니다.
사실 다국어지원 부분이 필요해서 데이터를 유니코드로 DB에
저장해야 해서 Mysql의 설정을 다음과 같이 했습니다.
Mysql 버젼 : mysql-4.1.7
====================================
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_results utf8
character_set_server utf8
character_set_system utf8
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server utf8_general_ci
=====================================
그리고 mysql에서 다음과 같은 sql문을 실행합니다.
INSERT INTO `specialentry_entry` VALUES (1,'방각하');
그러면 실제 데이터도 잘 들어가고 select를 해도 올바로 화면에
나타납니다.
실제 이 데이터가 DB에는 유니코드형식으로 어떻게 들어가 있나
확인해보기 위해서
mysqldump -u root -p specialentry > dump.sql를 하면
============================================================
-- MySQL dump 10.8
--
-- Host: localhost Database: specialEntry
-- ------------------------------------------------------
-- Server version 4.1.7-nt
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT
*/;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS
*/;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION
*/;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0
*/;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,
FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE,
SQL_MODE="NO_AUTO_VALUE_ON_ZERO" */;
--
-- Table structure for table `specialentry_entry`
--
DROP TABLE IF EXISTS `specialentry_entry`;
CREATE TABLE `specialentry_entry` (
`entryID` int(11) NOT NULL default '0',
`entryName` varchar(255) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Dumping data for table `specialentry_entry`
--
/*!40000 ALTER TABLE `specialentry_entry` DISABLE KEYS */;
LOCK TABLES `specialentry_entry` WRITE;
INSERT INTO `specialentry_entry` VALUES (1,'쨔챈째짖횉횕');
UNLOCK TABLES;
/*!40000 ALTER TABLE `specialentry_entry` ENABLE KEYS */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT
*/;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS
*/;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
=======================================================================
즉 '방각하' 문자열이 '쨔챈째짖횉횕'로 저장되어 있는 셈이죠.
위의 dump.sql을 참조해서 다음과 같은 두개의 sql문(a.sql,
b.sql)을 만들어 실행해보면
mysql -u root -p specialentry < a.sql
mysql -u root -p specialentry < b.sql
둘 다 올바르게 '방각하'라는 문자열이 들어가게 됩니다.
즉 b.sql의 /*!40101 SET NAMES utf8 */; 부분이 utf8 데이터를
제대로 입력하게 해주는 거 같습니다.
a.sql 내용
INSERT INTO `specialentry_entry` VALUES (1,'방각하');
b.sql 내용
/*!40101 SET NAMES utf8 */;
INSERT INTO `specialentry_entry` VALUES (1,'쨔챈째짖횉횕');
제가 궁금한 부분은 여기서 입니다. mysqldump의 설명을 보면
--default-character-set=charset
- Use charset as the default character set. See
section 5.8.1 The
Character Set Used for Data and Sorting. If not
- specified,
mysqldump from MySQL 4.1.2 or later
uses utf8 ; earlier versions use
latin1 .
기본적으로 백업할때 사용되는 character-set이 utf8인 것으로 되어
있습니다. (그 이전에는 latin1)
그래서 위에서처럼 mysqldump를 실행하면 SET NAMES utf8이라든가
'쨔챈째짖횉횕'과 같은 것이 나온거 같습니다.
근데 제가 '방각하'라는 문자열을 iconv나 다른 문제셋변환툴을
사용해 변환해서 Hex코드를 보면
EUC-KR '방각하' : B9 E6 (방) B0 A2(각) C7 CF(하)
UTF-8 '방각하' : EB B0 A9 (방) EA B0 81(각) ED 95 98(하)
mysqldump '방각하' : C2 B9 C3 A6(방) C2 B0 C2 A2(각) C3 87 C3
8F(하)
과 같습니다. 즉 mysqldump가 UTF-8에 해당하는 코드가 아니라는
거죠.
즉 다국어환경에서 sql문으로 직접 데이터베이스에 데이터를
집어넣을때 단순히 utf-8형태의 sql문을 실행한다고 해도
데이터가 제대로 안들어가지는 것입니다. 위와 같은 경우처럼요.
제가 직접 실행해보아도 제대로 안들어가더군요.
위에 sql문 a.sql을 iconv를 통해 utf-8형태로 변환하면
insert into specialEntry_entry values (6, '諛⑷컖??);
이렇게 나오는데 이걸 실행하면 이상한 값이 들어갑니다.
그렇다면 중국어나 일본어 등 다른나라 문자가 들어간 데이터를
집어넣는 방법은 어떻게 해야 하는건지 방법을 모르겠습니다.
그리고 위에서 mysqldump로 뽑아낸 '방각하'의 코드는 도대체 어떤
문자셋을 사용하고 있는지도 잘 모르겠구요.
사실은 java프로그램으로 디비에 데이터를 넣다가 도저히 안되어서
직접 이렇게 스크립트로 실행해 봤더니 값이 이상한게 들어있어서
도대체 방법을 모르겠어 이렇게 고수님들께 질문을 드립니다.
아래와 같은 일반적인 다국어 환경 프로그램에서 데이터 입력방법을
아시는 분은 조언 부탁드립니다.
다국어데이터(웹페이지, sql문 등 utf8인코딩) ----> mysql(내부
인코딩 utf8)
|