database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 22760 게시물 읽기
No. 22760
[질문]mysqldump에서의 인코딩과 일반적인 다국어(유니코드) 데이터 입력방법
작성자
이용훈(궁금해요)
작성일
2004-11-29 23:59
조회수
4,786

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)

 

 

 

[Top]
No.
제목
작성자
작성일
조회
22763db connect실패시 나오는 odbc설정 dialog 나오지 않게 하는법?
파워빌더
2004-11-30
1035
22762count(*) 수를 알고 싶습니다. [2]
신재
2004-11-30
1677
22761쿼리 문법 문의 드립니다.. [2]
friendy
2004-11-30
1689
22760[질문]mysqldump에서의 인코딩과 일반적인 다국어(유니코드) 데이터 입력방법
이용훈
2004-11-29
4786
22759비어있는테이블에 쿼리를 날렸을때의결과는.... [1]
초보
2004-11-29
991
22758mysqldump로 자동 백업시..
게스트
2004-11-29
1453
22757load data infile...시 [1]
박훈
2004-11-29
1706
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다