mysql 인코딩 - mysql dump 뜬 후 바로 복원했는데 일부가 깨집니다

lacovnk의 이미지

이상합니다 -o-
wordpress에서 wp_comments를

mysqldump bla wp_comments -uroot -p > a.sql
mysql bla -uroot -p < a.sql

그랬더니 글자 일부가 깨집니다 -o-

Quote:
트랙백 날려주셔�?� 좋았�?��?�?� ㅠ_ㅠ

dump화일 살펴보니, create table 마지막에 다음이 붙는군요.
ENGINE=MyISAM DEFAULT CHARSET=latin1_swedish_ci

왠 charset인가.. -o- 궁금해서 phpmyadmin으로 들어가 charset을 보니 캡쳐화면과 같이 나옵니다.

mysql 4.1.1,debian sarge

어느곳이 문제인지 궁금합니다 -o- 애초의 dump화일에 문제가 있던건가요?

iconv -f utf8 -t euckr dump 해보니

Quote:
'iconv: 2047 위치에 잘못된 입력 순서열이 있음

... orz

그렇다면 mysql에서 utf8을 쓰기 위해서 별다른 설정을 해줄 것이 있나요? 테이블 별로 charset이 존재하는 것은 어떻게 바꾸나요? (phpmyadmin에서 못찾겠네요; )

File attachments: 
첨부파일 크기
Image icon phpmyadmin_capture.png36.33 KB
lacovnk의 이미지

갑자기 새로 설치한 wordpress도 일부 깨지는 현상이 나타나기 시작했습니다 -o-

lacovnk의 이미지

음. IE에서는

Quote:
트랙백 날려주셔ㅤㅃㅛㅆ 좋았쿄ㅤㅌㅕㅊㅤㅃㅝㄹ ㅠ_ㅠ

이라고 뜨는군요 -o- 으음. 갑자기 왜이러지..

시스템 로케일은 euc-kr을 사용중입니다. 이외에 드릴 정보가 뭐가 있으려나..

lacovnk의 이미지

mysql 4.0에서 곧바로 4.1로 넘어오면서 생긴 문제로 보입니다 -o-

다운그레이드 하려고 했더니, 안되는군요 orz orz orz

어떻게 해야 하나 ㅤㅉㅡㅂㅤㅉㅡㅂ

1day1의 이미지

정확히 원인은 모르겠지만.
http://annyung.oops.org/?m=white&p=mysql41
를 참조해 보시기 바랍니다.

잘 해결되길..

F/OSS 가 함께하길..

lacovnk의 이미지

1day1 wrote:
정확히 원인은 모르겠지만.
http://annyung.oops.org/?m=white&p=mysql41
를 참조해 보시기 바랍니다.

잘 해결되길..

바로 저 문제입니다. 으으.

생각없이 4.1로 업그레이드 하고 쓰던게 음음..

계속 쓰는데 문제는 없는데, 인코딩을 바로 잡아주고 싶단 말입니다! 엉엉엉엉

아무튼 여러모로 무서워졌습니다. 역시 괜히 패키지가 나뉘어져 있는게 아니었군요. 으윽

salpoosi의 이미지

mysql이 utf-8을 지원함에도 불구하고 기본문자셋 설정을 하지 않아 latin1으로 설정하고 사용하는 경우가 대부분입니다.

제일로 눈에 띄는 문제점이 order by 가 되지 않습니다.
잠재적인 문자 깨짐이 발생할 수 있습니다.

일본어를 사용하면서 발생한 것을 해결하면서 찾는 결과입니다.

한글 문제 일때도 동일한 해결책이라고 보여 글을 남김니다.

우선 서버상에 vi 등으로 백업 받은 파일의 내용은 문자가 정상적으로 보이는지 확인합니다.

이상이 없으면 my.cnf에 다음과 같은 부분을 찾아서 바꾸어 줍니다.
일본어 언어일 경우에 사용한 내용이여 한글은 적당한 값으로 바꾸어 줍니다.

my.cnf
[mysqld]
default-character-set=sjis
language=/usr/share/mysql/japanese-sjis

[mysql.server]
default-character-set=sjis

[mysqldump]
default-character-set=sjis

default-character-set=sjis
 
위에 sjis와 japanese-sjis 부분을 변경하면 됩니다.
변경을 한후에 DB재 기동을 합니다.
 
설정 한 후에는 기본 테이블 문자셋은 설정한 값으로 바뀝니다.
 
이미 만들어진 테이블의 문자셋은 바꾸기 전의 문자셋을 가지고 있습니다.
 
재생성이 필요합니다.
 
백업받은 파일에서 뒤의 문자셋 부분은 위에서 바꾼 문자셋으로 변경 저장후 
복구 하면 이상이 없을겁니다.
lacovnk의 이미지

dump가 제대로 안됩니다. 정확히 말하면 되긴 되는데.. 정체불명의 charset이군요. vi에서 보이질 않습니다.

음. 일단은
ALTER TABLE tablename CHARSET=utf8
을 해줘도 안깨지도 잘 보이는군요.

이 상태에서

mysqldump dbname -p --default-character-set=latin1 > a.sql

하면, cat하면 한글이 잘 보이는데 (utf창입니다) vi로 하면 깨져보입니다. 이런 이상한... vi띄우면 "변환되었습니다"가 아래 상태창이 나타납니다 -o-

set해보니, fileencoding이 latin1로 나오는군요; 이를 utf8로 보고 싶은데 음음..

cat a.sql
tail a.sql -n 50

하면 모두 한글이 터미널에는 잘 보입니다

iconv -flatin1 -tutf8 a.sql 하면 오히려 한글이 깨집니다. 으음.. .

salpoosi의 이미지

저도 덤프 파일 가지고 iconv를 해보았지만 잘 되지 않더군요.

문제 해결 시간은 급한데 또 다른거 찾아서 해결하려니 힘이 들고 만약 되지 않으면 시간이 넘 아깝고.

제가 한 방법은 그냥 다른 이름으로 테이블을 만드시고 php로 하나 만드세요.

create table temptable;

insert into temptable select * from tablename;

temptable 에 자료 확인하시고

drop table tablename;
create table tablename;
만약 my.cnf 설정을 하지 않으셨으면 캐렉터 옵션 주어서 테이블 생성하세요.

insert into table1 select * from temptable;

복구에 가장 간단한 방법입니다.

lacovnk의 이미지

분석해본 결과... 삽질 기록을 여기다 남겨놓겠습니다;

* 그동안 기본charset인 latin1로 한글을 써왔습니다

* 이것은 mysql 내부에서는 별 문제를 안 일으킵니다 - 정렬 등의 문제가 있다고 하지만, 깨지는 문제는 없음
mysql의 my.cnf도 그렇고, php 역시 기본으로 latin1로 사용하고 있기 때문에 아무런 문제가 없습니다.

* 이를 적절한 charset인 euckr이나 utf8로 변환하기 위한 방법을 찾습니다
mysqldump를 뜨면, 파일 자체의 인코딩이 latin1인데, 이를 iconv를 써도 깨지는 등 호환성의 문제가 있어서 현재 어려움을 겪고 있습니다.

참고로, (다들 아셨던건가orz) char는 charset 기준으로 하기 때문에
latin1으로 놓을 경우 char(10)에 한글이 석자 이상 안들어가는 문제가 있는 반면 (3B인건가..)
alter table charset=utf8로 하면 한글이 열글자 들어갑니다. :)

table을 utf8로 놓고, mysql console 상에서 insert/update/delete/select가 모두 정상적으로 됩니다만.. 이 결과를 php에서 가져올 때에는 한글이 깨지는 문제가 발생합니다.

이 경우 php에서
mysql_query("SET CHARSET utf8"); 로 명시해버리면 됩니다. 설정 안된 경우 기본값을 쓸텐데,다른 app때문에 이를 아직 수정 안해줬으니..

가장 큰 문제는, 기존의 latin1으로 되어있는 억지 한글 내용들을 어떻게 utf8로 변환하느냐.. 인 것 같습니다.
모두 utf8으로 변환한 다음에는 app.들의 charset도 잘 살펴봐야 겠군요 -o-

덧붙여 놓습니다
http://dev.mysql.com/doc/refman/4.1/en/charset-upgrading.html

lacovnk의 이미지

lacovnk wrote:
* 이를 적절한 charset인 euckr이나 utf8로 변환하기 위한 방법을 찾습니다
mysqldump를 뜨면, 파일 자체의 인코딩이 latin1인데, 이를 iconv를 써도 깨지는 등 호환성의 문제가 있어서 현재 어려움을 겪고 있습니다.

iconv나 vim으로 안되는 반면..

MS windows에서 editplus로 해당파일을 불러오면, 인코딩을 선택하라고 그럽니다. 거기에서 utf8을 선택하면, 그래도 잃을 문자가 있다고 투덜대는데, 무시하고 엽니다.

그러면 잘 보입니다! 오오오오 그 후에 다른이름저장에서 utf8로 저장하니, vi에서도 잘 보입니다. 으흐흐

이제 제대로 mysql<dump 하는 것만 하면 되겠군요 :)

lacovnk의 이미지

정리가 되어가는군요~

다음과 같이 깔끔하게 utf8로 변경 가능합니다

$ mysqldump --default-character-set=latin1 dbname -p > temp.sql
$ iconv -feuckr -tutf8 temp.sql  > db.sql
# db.sql 상단에 다음을 명시해줍니다. 
# SET character set  utf8;
# create table 마지막에 붙어있는 CHARSET=latin1을 
# CHARSET=utf8로 변경합니다
mysql otherdbname -p < db.sql

mysql console 들어가서 set charset utf8 하고 select해서 보면 제대로 보입니다. :)

iconv를 안하고 위에 set charset euckr을 하면.. 한글이 모조리 안나오더군요. 으윽. (원인이 무얼까..)

그리고 ALTER TABLE CHARSET은 단지 charset만 바꾸어주는데, 이에 따라 안의 data는 변하지 않습니다. 뭐 dump때 참고하려나요? 음.. -o- 모르겠군요.

질문!
1.
set charset과
set character set이 동일한 것인가요? 음음
지금 사용할 charset을 선언해주는 것으로 이해하고 있습니다.
실제로 show variables like 'c%' 해보면
character_set_client 과 character_set_results 요 두놈이 따라가는군요~ (두 놈다...)

2.
collation을 명시안했더니 알아서 utf8_general_ci로 잡힙니다.
utf8_bin 등등, 다른것과 어떤 차이점이 있는지 어디를 보면 나오나요?
http://dev.mysql.com/doc/refman/4.1/en/charset-general.html
여기를 보면, collation은 그냥 비교하는 룰이라고 설명하는데, 그렇다면 한글은
utf8_bin / utf8_general_ci / utf8_unicode_ci 중에 뭘 골라야 하나요?

1day1의 이미지

고생 많으시네요. ^^

저도 조만간 4.1.x 나 5.0.x 로 이전예정인데, 좋은 참고가 될 듯 하네요.(미리 감사..)

F/OSS 가 함께하길..

익명 사용자의 이미지

wordpress 사용중인데, my.cnf를 수정하지 않고 다음과 같이 합니다

1.5기준
wp-include/wp-db.hpp에서 58번째 줄 쯤에 (class wpdb의 생성자 마지막)
$this->query("set charset utf8;");
을 추가해줬습니다. 잘나오는군요!

my.cnf에
[mysqld] section에

Quote:
init_connect=SET charset euckr

추가해주면, euckr을 사용하는 여러 웹프로그램들을 그대로 쓸 수 있습니다.

참고로

Quote:
init_connect=SET collation_connection = utf8_bin
init_connect=SET charset euckr
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_bin

위 설정을 [mysqld] section에 두면, 적용됩니다. 말 그대로 새로 생성되는 녀석에게 적용되는데.. 사실 자세한 옵션은 모르겠군요 :(

lacovnk의 이미지

dump.sh

echo "## Dump database[$1] - enter root password"
mysqldump --default-character-set=latin1 $1 -uroot -p > temp.sql && iconv -f euckr -t utf8 temp.sql > $1.utf8.sql
echo "## YOU NEED TO EDIT!";

$1이 존재하는지 여부 확인해야 하고,
파일의 적당한 위지에 "SET charset utf8;"을 삽입하고
글 전체에서 "CHARSET=latin1"을 "CHARSET=utf8"로 변경하는 부분을 덧 대주시면 좋겠습니다 :)

restore.sh

echo "## Restore database[$1] - enter root password"
mysql $1 -uroot -p < $1.utf8.sql

$1 존재 여부만 체크하면 되려나요? 음음..

lacovnk의 이미지

salpoosi wrote:
이미 만들어진 테이블의 문자셋은 바꾸기 전의 문자셋을 가지고 있습니다.

재생성이 필요합니다.

백업받은 파일에서 뒤의 문자셋 부분은 위에서 바꾼 문자셋으로 변경 저장후
복구 하면 이상이 없을겁니다.

요건

alter database dbname charset=utf8
alter table tbname charset=utf8

이런식으로 가능합니다. 굳이 다시 만들지 않아도 될 것 같습니다. (확인 안해봤습니다. 전 drop하고 다시 create-o-; ) table의 경우는 어차피 drop되었다가 다시 만드니 안고치셔도 되고..

그리고 앞서 말한 column size의 크기 문제가 꽤 중요할 것 같습니다.

어떤 분은 반으로 줄었다고 난감해하시더군요.
http://www.okjsp.pe.kr/bbs?act=VIEW&seq=55560&bbs=bbs4&keyfield=content&keyword=&pg=5
일부 업그레이드시에 size가 줄어드나 봅니다 -o- -o- -o- 저도 그런걸까요? 으음..

전 debian package로 올렸는데.. 음음. 뭐 줄어들었나 알수가 없군요. 적당히 기준이 되는 게 뭐가 있으려나.. phpbb2의 phpbb_users table의 스키마가

| user_sig_bbcode_uid   | varchar(10)           | YES  |     | NULL      |       |
| user_aim              | varchar(255)          | YES  |     | NULL      |       |
| user_yim              | varchar(255)          | YES  |     | NULL      |       |
| user_msnm             | varchar(255)          | YES  |     | NULL      |       |
| user_occ              | varchar(100)          | YES  |     | NULL      |       |
| user_interests        | varchar(255)          | YES  |     | NULL      |       |
| user_actkey           | varchar(32)           | YES  |     | NULL      |       |
| user_newpasswd        | varchar(32)           | YES  |     | NULL      |       |

위와 같이 나오는데, 다들 그런가요? 확인부탁드립니다 :)

관련 링크 :http://database.sarang.net/?inc=read&aid=24242&criteria=mysql&subcrit=&id=&limit=20&keyword=%C5%A9%B1%E2&page=1

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.