UTF-8 형식의 텍스트파일을 mysql에 넣으면 한글이 깨집니다ㅜㅜ
글쓴이: kkwa1009 / 작성시간: 금, 2015/11/27 - 4:16오후
.data 파일을 다른 프로그램으로 생성하였습니다.
(DXL이라는 언어로 만든 파일로.. DOORS라는 요구사항 관리 도구에서 지원하는 언어입니다. UTF8로 설정하여서 내보내기를 하였습니다.)
data파일을 MySQL에 생성해둔 table에 입력하는 perl 소스를 만들었습니다.
sub writeData { my (@linesIn, @listTokens, $queryInsert, $querySel, $queryUpdate, $dateToday, $hQuery, $fCnt, $affectedRows, $resultQuery); $dateToday = sprintf ("%04d-%02d-%02d", $year+1900, $month+1, $mday+2); # Connect to the database. my $dbh = DBI->connect("DBI:mysql:database=" . $MYSQL_DB . ";host=" . $MYSQL_HOST, $MYSQL_USER, $MYSQL_PASS, {'RaiseError' => 1}); # DXL 데이터 파일로부터 레코드 읽기 open (HFILE_IN, "\<" . $FILE_DATA); @linesIn = <HFILE_IN>; foreach my $aLine (@linesIn) { # 단위 레코드 라인을 파싱 (다음은 형식) # 문서명|문서유형|합의된개수|설계검토된개수|시험검토된개수|변경된개수|추적링크된개수|총개수 $aLine =~ s/\n//g; @listTokens = split /\|/, $aLine; # DB 레코드 추가 SQL 구문 작성 $queryInsert = "INSERT INTO $MYSQL_DB.$MYSQL_TBL (measure_date, doc_name, doc_type, proj_name, nAllReq, nAgreeReq, nDevReq, nDNAdevReq, nTestReq, nDNAtestReq) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; #&printLog("INFO", "QUERY: " . $queryInsert); $hQuery = $dbh->prepare($queryInsert); $resultQuery = $hQuery->execute($dateToday, $listTokens[0], $listTokens[1], $listTokens[2], $listTokens[3], $listTokens[4], $listTokens[5], $listTokens[6], $listTokens[7], $listTokens[8]); #fetch(); $hQuery->finish; print $listTokens[2]; print "\n"; } # Close the opened file close (HFILE_IN); # Disconnect from the database. $dbh->disconnect(); }
해당 코드를 실행할 때, print를 통해 특정 텍스트들을 출력해보았습니다.
정상적으로 출력되는 것이 확인되는데, SQL 테이블에 들어가면 첨부된 사진들과 같이 한글이 깨지는 문제가 발생합니다.
테이블과 관련된 모든 설정들은 utf8이고, 출력파일도 utf8입니다.. 왜 이럴까요??
고수님들의 조언을 부탁드립니다..
Forums:
첨부파일에 대한 설명
1번 파일은 .data 파일의 내용입니다
2번 파일은 mysql에 들어간 데이터의 내용입니다. workbench로 확인하였습니다.
3~4번 파일은 SQL 테이블 관련 설정 내용입니다..
5번 파일은 perl 모듈 실행했을 때의 모습들입니다
별 짓을 다해봤는데도 해결이 안되네요..
my.ini에도 전부 utf8로 설정되어 있습니다.. 오늘 하루종일 이것만 들고 했는데도 답이 안나오네요 답답합니다ㅜㅜ
한글폰트 사용하고 있나요?
http://blog.daum.net/_blog/BlogTypeView.do?blogid=0ojRD&articleno=349&categoryId=0®dt=20150311144334
검색해보니
Workbench에서 폰트가 잘못되어 한글이 깨지는 경우가 발생한다고 합니다.
지금 상황을 보아하니 DB에 저장, 출력 모두 잘 되는데
Workbench에서 유독 한글이 깨지는걸 보면 폰트 문제인것 같습니다.
한번 폰트를 한글 폰트로 바꿔보시는게 어떨까요..?
답변 감사합니다.
이전에 저도 저 글을 보고 한 번 시도해봤었나봅니다ㅜㅜ
이미 적용이 되어 있네요..ㅜㅜㅜㅜ 다른 폰트를 써봐야하려나요..?
제가 직접 한글을 치면 그건 제대로 들어갑니다..
데이터를 넣을 때 문제가 생기는걸까요?ㄷㄷ
그런데 첨부하신 스샷의 5번 파일을 보면, 윈도우
그런데 첨부하신 스샷의 5번 파일을 보면, 윈도우 명령 프롬프트에서 멀쩡하게 출력되고 있는 걸 보면 원본 데이터가 UTF-8이 아니라 cp949일 것 같기도 한데요.
(여기 적지 않은 소스의 다른 부분에서 출력 인코딩을 변환하고 계시거나, 명령 프롬프트 창의 코드페이지 설정을 바꾸셨다면 모르겠지만)
정확히 문제를 일으키는 부분이 어느 부분인지 확실치가 않아서 여러 경우의 수가 생기는데요.
일단 정말 저 텍스트 파일이 UTF-8로 되어 있는지 확인해보시고, (간단히는 윈도우 메모장으로 열어서 새 이름으로 저장하기 눌렀을 때 인코딩이 뭘로 잡혀 있는지)
1. UTF-8 맞다.
2. cp949 더라.
3. cp949 였고, 2번으로 해결이 안 되더라.
근데 저 excute 구문은 어차피 listToken 배열 원소를 순서대로 읽고 있으니까 이렇게 길게 쓸 것 없이
좋은 하루 되세요!
감사합니다. 그런데 새로운 문제가 생겼어요..
7번, 8번 은 제 코드들이에요..
9번 첨부파일과 같이 문제가 발생했어요
"or die"를 추가하기 전에는
readline() on closed filehandle HFILE_IN at ~~~~.pl line 101 (파일 가져오는 줄)
이라고 떴었기에, or die $를 추가했더니 9번과 같은 게 뜨네요..
open(HFILE_IN, "\<:encoding(UTF-8)" . $FILE_DATA) or die $!;
open(HFILE_IN, "\<\:encoding(UTF-8)" . $FILE_DATA) or die $!;
open(HFILE_IN, "\<\:encoding(UTF\-8)" . $FILE_DATA) or die $!;
open(HFILE_IN, "\<\:encoding\(UTF\-8\)" . $FILE_DATA) or die $!;
이렇게까지 해봤는데도 동일하네요.. 왜 이런 문제가 생기는걸까요..ㅜㅜ
$FILE_DATA 앞에 마침표가 아니라 컴마를
$FILE_DATA 앞에 마침표가 아니라 컴마를 쓰셔야 합니다. 그냥 긁어 복사해서 붙여넣으셨으면 금방 아셨을텐데 ^^;
open 을 인자 3개로 호출하는 형태고요.
왜 부등호나 콜론이나 뒤에 UTF-8 이런 곳 곳곳에 백슬래시가 보이는지 모르겠는데, 그건 에디터 버그로 추가되었나 싶군요.
좋은 하루 되세요!
감사합니다
덕분에 문제를 잘해결 하였습니다 : )
감사합니다~! 새해 복 많이 받으세요!!!
결과가 궁금했는데 달아주셔서 감사합니다. 이왕이면
결과가 궁금했는데 달아주셔서 감사합니다. 이왕이면 저를 비롯해서 나중에 같은 문제로 찾아오는 사람들을 위해서, 정확히 위에 제가 나열한 경우 중 어느 것에 해당이 되었는지, 최종적으로 해결된 코드는 어떤 것인지 적어주시면 더 좋을 것 같네요 :-)
좋은 하루 되세요!
댓글 달기