[완료] Mysql DB 복구시 한글깨짐

시월의 이미지

현재 윈도우 Mysql 5.0.18 을 사용 하고 있습니다.

궁금한건 A 라는 서버에서 DB 를 백업을 받았는데 character set=euckr 로 되어 있는게 문제입니다.

문제는 B 서버는 character set =utf8 인겁니다...

B 서버는 이미 여러가지 DB를 가지고 있고 지울수 없는 상태이구요.

A서버에서 받은 DB 를 복구를 시켜봤더니... ㅠㅠ
한글이 다 깨지는겁니다.

워드패드로 열어서 보면 한글은 재대로 표시가 됩니다.
워드패드로 SET NAMES utf8 로 바꾸기도 하고
DEFAULT CHARSET=utf8; 로 바꿔보았지만... 소용없더라구요...

서버를 euckr 로 바꾼 후 복구 시킨다음 utf8 로 다시 변경하고나서
show variables like 'c%'; 를 하면

character_set_database = euckr
collation_database = euckr_general_ci

utf8 로 안 바껴 있더라구요.. ㅠㅠ

아.. 답답합니다.
방법이 없나요??

--------------------------------------------------------------------------

어떻게 하다보니 한글이 출력이 잘 되더라구요..
utf8 출력하는 php 코드가 따로 있는데 그건 검색을 좀 해봐야할 것같네요.

이 질문에 답변 주신 모든 분들 고맙습니다.
덕분에 해결이 되었네요.

귀중한 시간 쪼개서 답변 달아 주신분들 복받으세요~~~~ ^^

dormael의 이미지

덤프, 리스토어 시에 양쪽 캐릭터 셋을 맞춰 주시면 문제가 없을것 같은데요.

물론 테이블의 캐릭터 셋이 바뀌는 것이므로 테이블 생성 쿼리도 가능하면 utf8 캐릭터 셋을 지정해 주시구요.

아래와 같은 식으로 하면 되는걸로 알고 있습니다.
기본적으로 mysql 커맨드라인 툴들의 서버 접속 기본 캐릭터 셋은 latin1로 알고 있습니다.

mysqldump --default-character-set=utf8 디비명 > 파일
 
혹시 덤프된 테이블의 캐릭터 셋이 utf8이 아닌 경우로 지정되어 있을경우 utf8로 변경
 
mysql --default-character-set=utf8 < 파일

지금 조금 헷갈리는데 utf8이 아니고 원래 캐릭터 셋일 가능성도 있습니다.
둘이 다를 가능성도...

지금은 utf8만 쓰고 있어서... ㅡ,.ㅡ

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

시월의 이미지

my.ini 에서 default-character-set 을 euckr 로 변경을 해야만... 한글이 재대로 출력이 되네요...

전 euckr db 를 utf8 db 로 변경을 하고 싶어서.. 질문은 한건데....

euckr -> utf8 로 한글 깨짐 없이 변경 못하나요??

그 db 용량이 50MB 좀 넘는거라 한글로 일일히 치기엔.. 너무 많은 db 라서요...

또 phpmyadmin 에서는 한글이 재대로 보이고 sqlyog 나 콘솔창에서는 한글이 한글이 깨져서 한문, '?' 이 두가지가
섞여서 나오네요...

정녕 방법은 없는건가요?

dormael의 이미지

지금 정확히 기억이 안나서 그러는데 우선 덤프된 텍스트 파일에서 한글이 제대로 보이는가는 신경쓰지 않으셔도 됩니다.

에디터에서 파일을 읽을때의 인코딩이나 폰트에 따라 제대로 보이지 않을수도 있기 때문입니다.

문제는 mysqldump에서의 출력 인코딩과 다른 디비에 넣을때의 인코딩이 적절한가 입니다.

우선 utf8로 덤프 넣을때 utf8이 제대로 되지 않았다면

덤프를 euckr, 넣을때 utf8로 해보시고(이게 적절한게 아닌가 생각이 됩니다.)

그래도 안된다면 테이블, 디비의 캐릭터 셋이 제대로 지정이 되어 있는지 확인해 보셔야 할 것 같습니다.

캐릭터 셋은 디비뿐 아니라 테이블, 컬럼에까지 별도로 다르게 지정이 가능하기 때문에 전체적으로 확인해 보셔야 합니다.

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

시월의 이미지

제가 덤프 파일을 에디더 플러스로 열어서 수정을 했거든요...

euckr 을 utf8 로 변환을 시켜서 복구도 해봤는데

mysqldump -uroot -p --default-character-set=utf8 test > test.sql

로 덤프를 하고나서 에디터 플러스로 수정

복구시에는
mysql -uroot -p --default-character-set=utf8 test < test.sql

위와 같이 했어도 한글이 깨지는건 마찬가지더라구요... ㅠㅠ

dormael의 이미지

한글이 깨진건 어디서 확인하신 건가요?

utf8로 세팅되어 있는 다른 디비의 다른 테이블은 잘 나오는데 복구한 디비만 깨져서 나오는 건가요?

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

시월의 이미지

sqlyog 에서 db 를 불러왔을때와 콘솔창에서 mysql -uroot -p 로 들어가서 확인 했을때 입니다.

다른 DB 쪽에는 문제가 없습니다.

다른 db는 아무 데이터가 없는 상태에서 이미 UTF8로 작업이 되어 왔던거였기 때문에
별문제가 없습니다.

복구한 db만 한글만 깨져서나오는데..
이건 ECUKR 로 되 DB에서 작업이 되오던거라서 위 경우와 다릅니다.

phpmyadmin 에서는 한들이 재대로 보이기는 합니다.

거기서는 Collation 이 euckr_korean_ci 로 나옵니다.... ㅠㅠ

dormael의 이미지

두 클라이언트에서

show variables like 'character%';

의 결과와 혹시 괜찮으시다면 깨지는 테이블의 스키마를

show create table 테이블명

으로 확인해서 올려주실 수 있나요?

까먹었던게 있는데 밑에 분이 올려주신 코멘트 에서 4번도 확인하셔야 합니다..

-- Signature --
青い空大好き。
蒼井ソラもっと好き。
파란 하늘 너무 좋아.
아오이 소라 더좋아.

시월의 이미지

설마.. 그걸 빼먹었으리라구요..

show variables like "c%" 로 할 시

+--------------------------+--------------------------------------------+
| Variable_name            | Value                                      |
+--------------------------+--------------------------------------------+
| character_set_client     | utf8                                       |
| character_set_connection | utf8                                       |
| character_set_database   | utf8                                       |
| character_set_results    | utf8                                       |
| character_set_server     | utf8                                       |
| character_set_system     | utf8                                       |
| character_sets_dir       | d:\PHP_Setup_for_IIS\MySQL\share\charsets\ |
| collation_connection     | utf8_general_ci                            |
| collation_database       | utf8_general_ci                            |
| collation_server         | utf8_general_ci                            |
| completion_type          | 0                                          |
| concurrent_insert        | 1                                          |
| connect_timeout          | 5                                          |
+--------------------------+--------------------------------------------+

위와 같이 utf8 로 되어 있습니다....

zz181321의 이미지

http://kldp.org/node/81341

이런 아티클도 있군요.

시월의 이미지

구글링을 통하여 많은 정보를 보고 해봤지만 해결이 되지 않아 올렸습니다.

지금 올려주신것도 보았고 한번 실행해 봤구요...

한글폰트가 깨지는 현상은 여전합니다.

set names euckr 을 적용을 시켜야 재대로 나오더라구요

제가 재대로 실행을 못한 거일수도 있지만...

여전히 phpmyadmin 에서는 정상출력이고 콘솔 화면 및 sqlyog 는 한글이 깨집니다.

euckr 로 만들어진 DB 를 utf8 로 변환을 바라는 거였는데...

위 방법은 euckr 과 utf8 을 동시 사용인걸로 설명한것 같은데.. (제목에 나와 있어서.. -ㅁ-;;)

여튼, 다시 설명을 드리자면
현재 A 서버는 euckr 로 동작을 하고 있고 B 서버는 utf8로 동작을 하고 있는 상황입니다.

A 서버의 A라는 Database 를 백업은

mysqldump -uroot -p --default-character-set=utf8 a > a_utf8.sql
mysqldump -uroot -p a > a.sql
두가지 방법을 동원하여서 복구도 시켜 보았고...

위 DB 를 리눅에서 전송 후
iconv -c -f euc-kr -t utf-8 a.sql > a.utf8
로도 방법을 동원해 보았으며

my.ini 파일의 defualt-chracter = euckr 로도 변경 후 a.sql 를 복구 시킨 후
utf8로 변경 후에 다시 재 백업을 받아본후 다시 복구 과정을 걸쳤었고

editplus 를 통하여 백업 파일 안에 euckr 을 utf8 로 전부 바꾼 후 복구 시켜도 보았습니다.

구글링을 통해서 각종방법으로 해보았지만
해결이 되지 않아.. 제 능력밖이라 질문을 올렸는데..
역시.. euckr 을 utf8 로 변경 시 한글은 깨질수 밖에 없는 건가요?

academic의 이미지

euckr 을 utf8 로 변경 시 한글은 깨질수 밖에 없다니 당치도 않습니다.

euckr을 utf8로 변경하는 작업을 많이 했었는데, 아무런 문제 없이 utf8로 변경했었습니다.

주로 제로보드 이전 버전을 utf8로 변경하기 위해서 많이 했었죠.

아래 말씀드리는 사항은 euckr을 utf8로 변경하기 위한 제 나름대로의 팁입니다.

(utf8로 변경하는 방법은 아주 많기 때문에 아래 방법을 따르지 않아도 변환 가능하다는 점을 미리 말씀드립니다.)

1.

sql 파일을 생성할 때 4.1 버전부터는 default-character-set을 지정하지 않으면 utf8로 설정됩니다. mysqldump를 할 때 반드시 테이블의 문자셋과 동일한 default-character-set(즉 euckr)으로 지정해줘야 좋습니다.

mysqldump --default-character-set=euckr a > a.sql

2.

mysqldump로 만든 sql 파일을 iconv를 이용해 utf8로 미리 변환하는게 좋습니다.

eucKR 대신에 CP949를 쓰는게 더 좋을 경우가 많았습니다.

iconv -f CP949 -t UTF-8

3.

sql 파일에서 character set 관련 설정이 있다면 지우는게 작업이 편합니다.

CREATE TABLE `zetyx_admin_table` (
... 
) ENGINE=MyISAM DEFAULT CHARSET=euckr;

위 부분을 아래처럼 바꾸면 됩니다.

CREATE TABLE `zetyx_admin_table` (
... 
) ENGINE=MyISAM;

sql 파일 크기가 너무 커서 편집하기가 힘들다면 mysqldump를 할 때 스키마와 데이터를 분리해서 만들면 용량 작은 스키마 파일만 편집하면 되니 편합니다.

mysqldump --no-data --default-character-set=euckr a > a_schema.sql
mysqldump --no-create-info --default-character-set=euckr a > a_data.sql

테이블 스키마만 저장하기 위해서는 --no-data 옵션을 주면 됩니다. 반대로 데이터 insert문만 저장하기 위해서는 --no-create-info 옵션을 주면 됩니다.

4.

mysqldump를 할 때 옵션을 어떻게 줬느냐에 따라 sql 파일 내에 set names euckr이라는 부분이 들어가 있을 수 있습니다.

들어가 있다면 이 부분을 지우고

sql 파일 맨 앞에 아래 부분을 추가해주는 것이 좋습니다.

set names utf8;

5.

옮겨갈 서버 설정에 따라 불필요할 수 있습니다만, 데이터베이스를 만들 때 ut8을 명시해 주는 것이 좋습니다.

CREATE DATABASE  db_name DEFAULT CHARACTER SET utf8

데이터베이스를 만들었다면 다음과 같이 제대로 utf8로 설정되었는지 확인해보십시오.

mysql> USE db_name;
Database changed
mysql> SHOW VARIABLES LIKE '%DATABASE';
+------------------------+-----------------+
| Variable_name          | Value           |
+------------------------+-----------------+
| character_set_database | utf8            |
| collation_database     | utf8_general_ci |
| skip_show_database     | OFF             |
+------------------------+-----------------+

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

시월의 이미지

여전히 select 로 데이터를 확인하면 援먯쑁怨쇳븰湲곗닠遺€ 한글이 이렇게 깨집니다.

php 로 db를 읽어서 출력 시에는 ????????? 로 뜹니다.. -ㅁ-;;;

리눅스에서 iconv 를 실행 했을때 이미 한글이 다 깨지더라고요.. 위에처럼...

academic의 이미지

1.

윈도우즈 커맨드 라인에서 mysql 을 실행해서 select를 하면

제대로 변환된 utf8은 깨져보입니다.

utf8을 볼 수 있는 환경에서 select를 해보거나...

set names euckr 명령을 먼저 실행한 다음

select를 해보시지요.

2.

iconv에서 문제가 생긴다는 것은 믿기 힘들군요.

중간에 에러가 나서 변환이 종료되는 경우는 봤어도

encoding을 제대로 설정했는데도 불구하고 글자가 깨진다는 건 믿기 어렵습니다.

터미널 설정에 utf8로 제대로 된 건가요?

--
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

----
academic은 제 고등학교 때 동아리 이름입니다.
academic, 아주 가끔은 저도 이랬으면 좋겠습니다.

enjoylife의 이미지

a server(euckr)

mysql> show variables like  '%char%';
+--------------------------+-----------------------------------------------+
| Variable_name            | Value                                         |
+--------------------------+-----------------------------------------------+
| character_set_client     | euckr                                         |
| character_set_connection | euckr                                         |
| character_set_database   | euckr                                         |
......

b server(utf8)

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
......

a server

mysqldump -hhost -uuser -ppassword --default-character-set=euckr dbnmae > dbname.sql

b.server

mysql -hhost -uuser -ppassword dbname < ./dbname.sql

저는 이렇게 하니 이상없더군요.
=============================
물 흐르듯이......

=============================
물 흐르듯이......

시월의 이미지

깨지더군요...

援먯쑁怨쇳븰湲곗닠遺€

이런식으료요.....

둘다 윈도우 서버인데....

윈도우라서 그런거일가요??? ㅠㅠ

lacovnk의 이미지

0. check list
질문이 길어지면서 여기저기 혼란이 있어보이네요. iconv가 깨진다는등.. 다음을 확실히 체크해보세요.

1) dump가 euckr이 맞는가?
2) dump를 utf8로 변환하고, 이 결과가 utf8이 맞는가?
--1)과 2)에서 주의: 에디터의 인코딩이 euckr과 utf8인지 확인.
3) mysql 설정을 바꾸고 나서 서버 재시작을 해줬는가?
4) 접속한 클라이언트의 설정이 모두 utf8인가? 그리고 폰트를 모두 지원하는가?
-- phpmyadmin인 경우 phpmyadmin, web browser
-- mysql console인 경우 mysql connection, 실행 환경[cmd.exe, ssh program..)
-- php 테스트 프로그램인 경우, php의 설정
-- sqlyog인 경우 sqlyog의 설정

그리고.. academic 님이 지적한 것이 맞습니다. 자세한 설명은 아래에..

1.
utf8 db에 euckr 환경에서 접근할 때 set names euckr를 쓰면 잘 나옵니다

Quote:
A SET NAMES 'x' statement is equivalent to these three statements:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

즉 db 자체의 charset은 건들지 않습니다. 일단 쿼리를 날려서 갖고 온 것을 x 인코딩으로 돌려줍니다.

db 자체는 latin1로 있어도 상관 없습니다. 즉 다음과 같이 써도 상관 없다는 거죠. 이게 테이블 별 charset 설정이 없을 때 이용하던 방법이죠. 그리고 아직도 많이 쓰이고..
charset이나 collation이 제대로 되어 있지 않아도 보통 쓰는데 상관 없습니다. 문제는 정렬-_-과 문자열 함수에서 charset에 맞는 행동을 안보인다는 거죠..

* db의 collation/charset은 latin1
* 입출력시 모두 set names euckr로 설정

insert query (euckr) => table 저장 (latin1) => select query(euckr) => result (euckr)

2.
windows에서 cmd.exe를 통해서 mysql을 실행시키시나요? 그렇다면 프로그램 자체가 utf8을 제대로 처리하지 못하는 것일 수도 있습니다.

지금 windows가 아니라 확인 불가 -_-

phpmyadmin등에서 잘 보이는데 mysql console에서는 깨져보인다는 증상이 심증을 굳히는군요.. set names euckr해야 잘 보인다는 것이 더더욱 :)

http://wiki.rubyonrails.org/rails/pages/HowToUseUnicodeStrings
http://winnwe.com/index.php/windowsxp/perma/285

3.
덧붙여.. 그러므로 iconv할 필요 없이, 파일의 인코딩과 현재 환경의 인코딩을 맞추고 (window라면 euckr) 파일 제일 앞에 set names euckr을 넣으면 됩니다.
그리고 나서 utf8환경에서 set names utf8하고 utf8쿼리를 날려주면 utf8 결과가 나오는거죠...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.