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 23023 게시물 읽기
No. 23023
EUC-KR -> UTF-8 변환 질문???
작성자
씩...
작성일
2005-01-25 17:47
조회수
6,089

이것 때문에 몇일을 고생하고 있는지 모르겠습니다.

지금 하고 있는 건 EUC-KR로 되어 있는 파일을 읽어 UTF-8로 DB에 저장하는 프로그램입니다.

UTF-8 변환은 iconv 라이브러리로 했습니다.

대략적인 순서는 다음과 같습니다.

 

File Read (EUC-KR) -> Parse -> 쿼리 생성 -> ICONV (UTF-8) -> Mysql 입력

 

위와같이 하는 중에 ICONV 로 변환된 쿼리를 출력하여 보면 UTF이 맞는데 막상

mysql_query로 해당 쿼리를 입력한뒤 DB내용을 출력하여 보면 중간 중간 깨져서

제대로 표현이 안되네요..

또한 mysql_client로 쉘 상에서도 확인이 안되구요..

참고로 mysql 버전은 4.1.9 버전입니다. mysql의 character-set은 UTF-8로 변경이 되어있는데 상태입니다.

대체 뭐가 문제일까요..

아님 UTF-8쿼리를 입력하면 다른 mysql 함수를 사용해야 하나요?

 

 

이 글에 대한 댓글이 총 6건 있습니다.

어떤 값이 저장될 때 실제로 적용되는 문자셋은 해당 필드의 문자셋입니다.

 

show full columns from TBL;

 

명령을 통해 원하는 필드의 문자셋을 확인하고

 

set names utf8;

 

명령을 통해 작업환경의 문자셋이 utf8로 설정한 후 작업을 해보시기 바랍니다.

 

iconv의 경우 제 경험상 변환도중 오류가 발생했을 경우 문제가 되는 경우가 있었습니다. 만약 php 를 사용하신다면 mb_convert()를 사용하는게 더 나은 방법일 수 있습니다.

망게님이 2005-01-26 13:53에 작성한 댓글입니다. Edit

네 망게 님의 답변 고맙습니다.

 

적어준대로 해당 테이블의 내용을 살펴본 결과 utf8이 맞습니다.

 

또한 제가 php를 사용하는게 아니라서 ... c언어로 API를 이용하여

작성하고 있습니다.

 

 더불어서 오늘 특이할 만한 내용을 발견하였씁니다.

API중 mysql_character_set_name()이라는 함수가 있는데

이걸통해 mysql_real_connect후에 character set을 찍어본 결과

latin-swedish로 표기가 되더군요...

 

아마 이쪽에서 의심이 가는데  set names utf8로 쿼리를 날려도

connect 시의 character-set은 변경이 되지 않는군요..

 

이부분을 중점적으로 찾아보구 있습니다.

 

대체 무슨 이윤지...ㅠ.ㅠ

씩..님이 2005-01-26 14:48에 작성한 댓글입니다. Edit

mysql_character_set_name() 함수에 버그가 있는 듯 합니다.

show variables 쿼리 값을 모두 출력해 보았는데... utf8이 맞더군요..

 

아마 현재 charset이 아니라 기본값을 출력해주는 함수인듯 하군요.

씩님이 2005-01-26 16:15에 작성한 댓글입니다. Edit

 

저도 linux g++로 같은 결과를 얻었습니다. 지금까지 제가 테스트해본 문자셋은 euckr과 latin1 이었는데 utf8을 좀 다른것 같네요.

 

g++에서 말고 mysql 프로그램을 통해 몇가지 테스트를 해봤는데 현재 환경이 utf8일 경우에는 한글 입력이 안됩니다. set names euckr; 후에 한글을 입력하고 보는데는 문제가 없습니다. 그러나 euckr 상태에서 한글을 추가하고 set names utf8; 을 한 후 해당 테이블을 select 해보면 문자가 깨져 있습니다.

 

이건 정확하지 않지만 제 생각에는 utf8 자체가 다국어이기 때문에 현재 추가되는 문자의 문자셋이 어떤것이다 라고 알려줘야 하는게 아닌가 싶습니다.

 

그러므로 set names euckr 을 날려서 환경을 한글로 설정한 후 데이터를 추가하는 것을 시도해보면 좋을 듯 합니다. 물론 가져올때도 한글을 가져올 수 있도록 set names를 하시구요. 가져올 때는 select FLD_NAME collate 'euckr_korean_ci' from TBL; 처럼 가져와도 됩니다.

 

더욱 정확한 정보는 고수분들이 주시겠죠. 확실한 답변을 드리지 못해 죄송합니다.

망게님이 2005-01-26 19:38에 작성한 댓글입니다. Edit

몇가지 테스트를 해봤는데 잘 되는구요. 테스트 소스입니다.

 

int main(int argc, char** argv)
{
        //size_t insize = 5, outsize = 100;
        size_t insize = 0, outsize = 100;
        char inbuf[1024] = {0x00, };
        char outbuf[1024] = {0x00, };
        char *ip, *op;

        strcpy(inbuf, "한글");

        iconv_t icon = iconv_open("utf-8", "euc-kr");


        insize = strlen(inbuf);
        outsize = 1024;
        ip = inbuf;
        op = outbuf;
        size_t icon_res = iconv(icon, &ip, &insize, &op, &outsize);

        printf("inbuf:%s\ninsize:%d\noutbuf:%s\noutsize:%d\nlen:%d\nres:%d\nerr:%d\n", inbuf, insize, outbuf, outsize, strlen(outbuf), icon_res, errno);

        iconv_close(icon);


        char buf[1024];
        sprintf(buf, "insert into test3 values ('%s')", outbuf);


        MYSQL *db = NULL;
        int error;

        /* make cfg from db */
        db = mydb_connect("test");

        mydb_do_query(db, "show variables like 'char%'");
        YMdb_do_query(db, "set names utf8");
        printf("-----------------\n");
        mydb_do_query(db, buf);
        mydb_do_query(db, "show variables like 'char%'");

        if (db != NULL)
                mydb_disconnect(db);

        return error;
}

테이블 DML 입니다.

 

mysql> show create table test3;
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                           |
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
| test3 | CREATE TABLE `test3` (
  `id` varchar(20) character set utf8 collate utf8_unicode_ci default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

제대로 '한글'이라는 문자열이 추가되는것을 확인했습니다. 레코드 확인은 mysql 프로그램으로 했는데 제대로 추가된 한글을 보려면 set names euckr 로 한글이 제대로 출력되도록 설정해줘야 합니다.

망게님이 2005-01-29 02:58에 작성한 댓글입니다. Edit

우선 망게님의 답변 고맙습니다.

 

제가 위에 테스트 했던 내용들에 오류가 있었습니다 ㅠ.ㅠ

 

입력시에는 문제가 없는데 출력시 Connect가 다르다는걸 잊고

 

계속 테스트를 진행하여 발생한 문제였습니다.

 

  UTF8을 사용하기 위한 방법을 정리해 보면 우선

1. DB 생성시 UTF8 옵션 추가

ex) create database test DEFAULT CHARACTER SET utf8 collate utf8_general_ci

 

2.  TABLE 생성시 UTF8옵션 추가

 

ex) create table test(

..................

) default character set utf8 collate utf8_general_ci ;

 

 

3. INPUT/OUPUT  실행시 CONNECT후 다음 쿼리 설정

 ex) set names utf8;

 

p/s : 다음과 같은 순서로 진행하면 큰 문제는 없는듯합니다. 다만

콘솔로 작업을 진행할시에는 terminal character-set 과 my.cnf의

character-set이 동일해야 무난히 작업을 진행할 수 있습니다.

 

p/s : mysql 덤프파일을 입력시 iconv로 먼저 utf8로 변환한 후 다음과 같이 덤프하면 잘 입력됩니다.

 ex) mysql --default-character-set=utf8 < dump file

이상.. 허접맨의 삽질 고백이었습니다. ㅠ.ㅠ

씩~~님이 2005-02-15 15:42에 작성한 댓글입니다.
이 댓글은 2005-03-03 21:20에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
23026Mysql 삭제후에도 서비스에 남아 있네요..ㅠㅠ [1]
박기원
2005-01-25
1426
23025두개의 테이블에서 서로 다른 값을 가져 오려면여??
궁금
2005-01-25
1287
23024mdb->mysql 프로그램적으로 처리 가능할까요? [1]
장준혁
2005-01-25
2054
23023EUC-KR -> UTF-8 변환 질문??? [6]
씩...
2005-01-25
6089
23022특정필드의 값이 없는경우의 레코드셋은
초보
2005-01-25
932
23021Mysql 4.18 한글문제
yCHAT
2005-01-25
2744
23020도와주세요 csv파일을 올리는데...내용부분이 이상해요... [1]
초보
2005-01-25
1445
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다