UTF-8 형식의 텍스트파일을 mysql에 넣으면 한글이 깨집니다ㅜㅜ

kkwa1009의 이미지

.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입니다.. 왜 이럴까요??
고수님들의 조언을 부탁드립니다..

File attachments: 
첨부파일 크기
Image icon 1.JPG64.59 KB
Image icon 2.JPG41.87 KB
Image icon 3.JPG52.5 KB
Image icon 4.JPG32.65 KB
Image icon 5.JPG17.23 KB
kkwa1009의 이미지

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&regdt=20150311144334

검색해보니

Workbench에서 폰트가 잘못되어 한글이 깨지는 경우가 발생한다고 합니다.

지금 상황을 보아하니 DB에 저장, 출력 모두 잘 되는데

Workbench에서 유독 한글이 깨지는걸 보면 폰트 문제인것 같습니다.

한번 폰트를 한글 폰트로 바꿔보시는게 어떨까요..?

kkwa1009의 이미지

이전에 저도 저 글을 보고 한 번 시도해봤었나봅니다ㅜㅜ
이미 적용이 되어 있네요..ㅜㅜㅜㅜ 다른 폰트를 써봐야하려나요..?

제가 직접 한글을 치면 그건 제대로 들어갑니다..
데이터를 넣을 때 문제가 생기는걸까요?ㄷㄷ

댓글 첨부 파일: 
첨부파일 크기
Image icon 6.JPG0바이트
raymundo의 이미지

그런데 첨부하신 스샷의 5번 파일을 보면, 윈도우 명령 프롬프트에서 멀쩡하게 출력되고 있는 걸 보면 원본 데이터가 UTF-8이 아니라 cp949일 것 같기도 한데요.
(여기 적지 않은 소스의 다른 부분에서 출력 인코딩을 변환하고 계시거나, 명령 프롬프트 창의 코드페이지 설정을 바꾸셨다면 모르겠지만)

정확히 문제를 일으키는 부분이 어느 부분인지 확실치가 않아서 여러 경우의 수가 생기는데요.

일단 정말 저 텍스트 파일이 UTF-8로 되어 있는지 확인해보시고, (간단히는 윈도우 메모장으로 열어서 새 이름으로 저장하기 눌렀을 때 인코딩이 뭘로 잡혀 있는지)

1. UTF-8 맞다.

open (HFILE_IN, "\<" . $FILE_DATA); # 여기를
 
open( HFILE_IN, "<:encoding(UTF-8)", $FILE_DATA );   # 이렇게 고쳐보세요.

2. cp949 더라.

open( HFILE_IN, "<:encoding(cp949)", $FILE_DATA );

3. cp949 였고, 2번으로 해결이 안 되더라.

use Encode;
...
open( HFILE_IN, "<:encoding(cp949)", $FILE_DATA );
...
$resultQuery = $hQuery->execute($dateToday,
    encode('UTF-8', $listTokens[0]),   # 한글이 들어있을 수 있는 항목마다
    encode('UTF-8', $listTokens[1]),
    ...
    encode('UTF-8', $listTokens[8])
);

근데 저 excute 구문은 어차피 listToken 배열 원소를 순서대로 읽고 있으니까 이렇게 길게 쓸 것 없이

$resultQuery = $hQuery->execute($dateToday, map { encode('UTF-8', $_) } @listTokens[0 .. 8] );

좋은 하루 되세요!

kkwa1009의 이미지

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 $!;

이렇게까지 해봤는데도 동일하네요.. 왜 이런 문제가 생기는걸까요..ㅜㅜ

댓글 첨부 파일: 
첨부파일 크기
Image icon 7.JPG0바이트
Image icon 8.JPG0바이트
Image icon 9.JPG0바이트
raymundo의 이미지

$FILE_DATA 앞에 마침표가 아니라 컴마를 쓰셔야 합니다. 그냥 긁어 복사해서 붙여넣으셨으면 금방 아셨을텐데 ^^;
open 을 인자 3개로 호출하는 형태고요.

왜 부등호나 콜론이나 뒤에 UTF-8 이런 곳 곳곳에 백슬래시가 보이는지 모르겠는데, 그건 에디터 버그로 추가되었나 싶군요.

좋은 하루 되세요!

kkwa1009의 이미지

덕분에 문제를 잘해결 하였습니다 : )
감사합니다~! 새해 복 많이 받으세요!!!

raymundo의 이미지

결과가 궁금했는데 달아주셔서 감사합니다. 이왕이면 저를 비롯해서 나중에 같은 문제로 찾아오는 사람들을 위해서, 정확히 위에 제가 나열한 경우 중 어느 것에 해당이 되었는지, 최종적으로 해결된 코드는 어떤 것인지 적어주시면 더 좋을 것 같네요 :-)

좋은 하루 되세요!

댓글 달기

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