[최초보]mysql의 한글 문제

Submitted by dhchoi on 2009.10.05.(Mon) - 18:51

여러 고수님들 추석은 잘 쇠셨습니까? 해를 거듭할 수록 명절이 겁이 납니다.... :D
지난번 여러 분들의 도움으로 무사히 mysql에 입력하는 php code를 작성하였습니다.
다시 한번 감사드립니다.

그런데, 이상하게 mysql에서 조회를 하면 깨져 보입니다.
(그림을 올리려고 했더니 안되는 군요... 방법이 없을까요???)
Debian Etch구요... 처음 mysql에 로그인을 하여 자료를 조회해 보면 한글은 ???? 이렇게 보이구요...
set names utf8;로 하면 phpmyadmin에서 작성한 것만 한글이 정상으로 보이고 나머지,
리눅스에서 입력을 했던 윈도우에서 입력을 했던, 자료는 깨져 보입니다.(표현을 못하겠습니다)

어떤 방법이 있는지 mysql Koea는 물론 구글에서도 조회를 해 보았지만 너무 실력이 없어서 자료를 찾을 수가 없었습니다.
혹시 어디서 이 문제를 해결 할 수 있는지 길을 알려 주시면 감사하겠습니다.
다시 한번 도움 부탁드립니다.
감사합니다.
최 초보 드림 꾸~~~~~~~~벅!!!!

westporch

작성: 2009.10.05.(Mon) - 21:09

수정: 2017.05.03.(Wed) - 11:47

리눅스에서 APM 소스 컴파일 하기 귀찮을 때 윈도에서 오토셋이란 프로그램으로 APM을 설치하여 mysql을 이용하곤 했어요.
mysql 명령 창에서 한글 값을 입력하고 select 명령을 이용해서 한글로 입력된 자료를 불러오면 깨져서 출력되었는데
'쿼리 브라우저'를 사용하면 한글이 깨지지 않고 제대로 출력할 수 있었어요.

'쿼리 브라우저'에 대해 검색하시면 답이 나올것 같아요.
제 답변이 정답이 아니라면 다른 분들이 더 좋은 답변 주실거에요.

eunchul

작성: 2009.10.05.(Mon) - 21:58

수정: 2017.05.03.(Wed) - 11:49

http://notes.timeghost.net/2008/10/utf-8-and-mycnf.html
http://dev.claztec.net/41
을 참고하시고요.

google에서 'mysql ut8 my.cnf' 라는 키워드로 검색한 결과입니다.
한글 블로그는 위의 키워드에 '한글' 을 추가한 결과고요.. :p

제 경우는 debian-lenny, mysql-5.0.51에서는 /etc/mysql/my.cnf 파일에서
[client] 
... 
default-character-set=utf8 

[mysqld] 
... 
default-character-set=utf8
의 설정으로도 한글입출력이 잘 되었습니다.

dhchoi

작성: 2009.10.05.(Mon) - 23:51

수정: 2017.05.03.(Wed) - 11:52

댓글 주신분들께 진심으로 감사드립니다. 
http://notes.timeghost.net/2008/10/utf-8-and-mycnf.html http://dev.claztec.net/41 을 참고하시고요.
위의 두 링크를 모두 검색하여 보았습니다만 같은 내용으로 보여 집니다.

어떻든 my.cnf를 통채로 복사한 후 mysql을 다시 실행한후 윈도우에서 자료를 다시 입력하여 보았으나 결과는 같습니다.
서버의 locale도 utf8로 제대로 설정을 하였구요..

다시 한번 도움 부탁드립니다.
감사합니다.
최초보 드림 꾸~~~~~~벅!!!!

우선 확인해 보실것이 mysql 환경설정입니다.
mysql -u root mysql


mysql 서버에 접속해서

mysql> show variables like '%char%'; 
+--------------------------+----------------------------+ 
| Variable_name | Value | 
+--------------------------+----------------------------+ 
| character_set_client | utf8 | 
| character_set_connection | utf8 | 
| character_set_database | utf8 | 
| character_set_filesystem | binary | 
| character_set_results | utf8 | 
| character_set_server | utf8 | 
| character_set_system | utf8 | 
| character_sets_dir | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec)

처럼 utf8 설정이 되었는지 확인해 주세요.

그리고 해당 database 의 생성된 table 을 확인을 해야 합니다.
이미 latin1 환경에서 생성된 테이블이라서 입력되는 데이터는 utf8 으로 되어있어도 latin1으로 될것입니다.
그래서 my.cnf 에서 'SET NAMES utf8' 같이 해주는데 해당 database 에 접속하셔서

mysql> show create table ;

으로 질의해보시면 DEFAULT CHARSET의 값을 확인하실 수 있습니다.

우와 빠른 댓글에 진심으로 감사드립니다.
mysql> show variables like '%char%'; 
+--------------------------+----------------------------+ 
| Variable_name | Value | 
+--------------------------+----------------------------+ 
| character_set_client | utf8 | 
| character_set_connection | utf8 | 
| character_set_database | latin1 | 
| character_set_filesystem | binary | 
| character_set_results | utf8 | 
| character_set_server | utf8 | 
| character_set_system | utf8 | 
| character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 
8 rows in set (0.01 sec) 
[client] 
port = 3306 
socket = /var/run/mysqld/mysqld.sock default-character-set=utf8

[mysqld] 
# # * Basic Settings # 
user = mysql 
pid-file = /var/run/mysqld/mysqld.pid 
socket = /var/run/mysqld/mysqld.sock 
port = 3306 
basedir = /usr 
datadir = /var/lib/mysql 
tmpdir = /tmp 
language = /usr/share/mysql/korean 
skip-external-locking default-character-set=utf8 
default-collation=utf8_general_ci 
character-set-server=utf8 
collation-server=utf8_general_ci 
init-connect='SET NAMES utf8' 

이렇게 되어 있습니다만 역시 결과는

mysql> select * from company; 
+----+------------------------------------+--------------+-------------+-------------------------------------+------------------------------------+ 
| id | name | tel | fax | address | remarks |
+----+------------------------------------+--------------+-------------+-------------------------------------+------------------------------------+ 
| 1 | myphpadmin에서입력 | 456-78797 | 87979-76464 | myphpadmin에서입력 | myphpadmin 에서입력 | 
| 2 | server에서 ìž…ë ¥ | 456-45843464 | 64645-54464 | serever에서 ìž…ë ¥ | server에서 ìž…ë ¥ | 
| 3 | windowì—ì„œìž…ë ¥ | 3939-303030 | 3333-00999 | windowì—ì„œìž…ë ¥ | windowì—ì„œìž…ë ¥ |
+----+------------------------------------+--------------+-------------+-------------------------------------+------------------------------------+ 
3 rows in set (0.00 sec) 

이렇게 나옵니다.

id 1번은 phpmyadmin을 이용하여 웹에서 입력한 내용이고
2번은 server에서 브라우저를 이용하여 입력
3번은 window에서 브라우지를 이용하여 입력한 내용입니다.

수고스러우시겠지만 좀 더 도움을 부탁드립니다.
감사합니다.
최 초보 드림 꾸~~~~벅!!!

/etc/mysql/my.cnf 변경후 mysql 재시작은 하셨나요?
재시작 하신다음에 company 테이블이 소속되어있는 database에 접속하신후,
mysql> show create table company;
라고 질의를 하시면 company 테이블의 스키마 정보를 보여줍니다.
맨 끝쪽에 DEFAULT CHARSE 이라는 값이 아마도 latin1 으로 되어있을듯 합니다.
mysql> alter table company CHARACTER SET = utf8;
으로 변경하시거나 아예 company 테이블을 삭제하셨다가 새로 만드시면 해결될듯 합니다.

dhchoi

작성: 2017.05.03.(Wed) - 12:12

수정: 2017.05.03.(Wed) - 12:14

In reply to by eunchul

댓글 감사합니다.
물론 my.cnf화일 수정후 mysqladmin을 사용하여 mysql을 재시작하였습니다.
mysql> show create table company; 
+---------+----------------------------------+ 
| Table | Create Table | 
+---------+----------------------------------+ 
| company | CREATE TABLE `company` ( `id` int(6) NOT NULL auto_increment, `name` varchar(30) NOT
            NULL, `tel` varchar(20) default NULL, `fax` 
            varchar(20) default NULL, `address` varchar(50) default NULL, `remarks` varchar(100) 
            default NULL, KEY `id` (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 | 
+---------+--------------------------------------------+ 
1 row in set (0.00 sec) 
이렇게 나옵니다.
또한, 지우고 새로 만들면서(phpmyadmin에서) collation을 utf8_general_ci로 설정하였는데도 결과가 위와 같습니다.

다시 한번 도움 요청드립니다.
감사합니다.
최 초보 드림 꾸~~~~~벅!!!

mysql client 에서 직접 한글을 입력하면 잘 되시나요?
조건이 mysql 서버가 utf8 환경이고, terminal 도 utf8 인코딩일때 입니다.
terminal 의 인코딩이 euckr 이거나 하면 한글이 깨질것입니다.

만약 mysql client 에서 한글 입출력이 잘 된다면, 웹 프로그래밍하실때 인코딩을 체크해보셔야 합니다.
html 태그의 meta 태그에 인코딩 설정이 utf-8 으로 되어있는가..
apache 설정에서 utf8이 기본으로 되어있는가..
웹 프로그래밍에서 인코딩 처리가 큰 이슈중에 하나인듯 합니다. :)
물론 영어권 나라들은 그닥 관심이 없는듯 하지만요..

mysql> select * from company; 
| id | name | tel | fax | address | remarks | 
+----+------------------------------------------------+--------------+-------------+----------------
------------------------------------------------------+---------------------------------------------
--------------------------------------------------------------------+ 
| 1 | myphpadmin에서입력 | 456-78797 | 87979-76464 | myphpadmin에서입력 | myphpadmin에서입력 | 
| 2 | server에서 ìž…ë ¥ | 456-45843464 | 64645-54464 | serever에서 ìž…ë ¥ | server에서 ìž…ë ¥ | 
| 3 | windowì—ì„œìž…ë ¥ | 3939-303030 | 3333-00999 | windowì—ì„œìž…ë ¥ | windowì—ì„œìž…ë ¥ | 
| 4 | html에서utf8 | 45-45- | 464- | html에서utf8주소 | html에서utf8기타 | 
| 5 | ê³ ì¹˜ê³ íšŒì‚¬ | 454-47465464 | 646464 | ê³ ì¹˜ê³ ì£¼ì†Œ | ê³ ì¹˜ê³ ê¸°íƒ€ | 
| 6 | 직접입력 | 111-3333 | 1134-43434 | 직접입력한 주소 | 직접입력한 기타 | 
| 7 | ë¦¬ëˆ…ìŠ¤ì—ì„œìž…ë ¥ | 455-78941 | 4456546 | 리눅스에서 ìž…ë ¥í•œ 주소 | 리눅스에서 ìž…ë ¥í•œ 기타 기타 타타타타 | 
+----+------------------------------------------------+--------------+-------------+----------------
------------------------------------------------------+---------------------------------------------
--------------------------------------------------------------------+ 
7 rows in set (0.00 sec) 
1) 위에서 보시는 바와 같이 직접입력은 아주 잘 됩니다.
2) 터미널도 기본로케일 UTF-8을 사용합니다.
3) html문서도 아래와 같이 되어있습니다. Company Input
4) apache설정 파일은 아래와 같습니다.
# # Specify a default charset for all pages sent out. This is 
# always a good idea and opens the door for future internationalisation 
# of your web site, should you ever want it. Specifying it as 
# a default does little harm; as the standard dictates that a page 
# is in iso-8859-1 (latin1) unless specified otherwise i.e. you 
# are merely stating the obvious. There are also some security 
# reasons in browsers, related to javascript and URL parsing 
# which encourage you to always set a default char set. 
# #AddDefaultCharset ISO-8859-1 AddDefaultCharset UTF-8 

뭐가 잘못된 것일까요? 진심으로 도움 부탁드립니다.
감사합니다.
최 초보 드림 꾸~~~~~벅!!!!

wildapple

작성: 2009.10.07.(Wed) - 13:28

수정: 2017.05.03.(Wed) - 12:30

입력 페이지( utf8이 아닐 경우 utf8로 저장되지 않는군요.
gnome-terminal에서 문자 인코딩 설정을 한국어로 바꾸고 select를 하면 utf8로 입력된 글자는 제대로 나오지 않고 euckr로 입력된 글자는 잘 나옵니다.
혹시 이 경우가 아닐까요?

* mysql character 설정
mysql> show variables like '%char%'; 
+--------------------------+----------------------------+ 
| Variable_name | Value | 
+--------------------------+----------------------------+ 
| character_set_client | latin1 | 
| character_set_connection | latin1 | 
| character_set_database | latin1 | 
| character_set_filesystem | binary | 
| character_set_results | latin1 | 
| character_set_server | latin1 | 
| character_set_system | utf8 | 
| character_sets_dir | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

mysql> show create table test;
+-------+----------------+ 
| Table | Create Table | 
+-------+----------------+ 
| test | CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `string` varchar(50) DEFAULT   
         NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 | 
+-------+----------------+ 
1 row in set (0.00 sec)

 

댓글 감사합니다. 그런데 어떻게 해보라는 말씀이신지.....
죄송합니다만 어린 아이 가르치듯이 하나 하나 일러주시면 정말 감사하겠습니다.
다시 한번 말씀드리면,

1) Debian Etch
2) Default locales = utf8
3) Terminal = utf8
4) Mysql charset = utf8
5) html meta tage = utf8

... 여하튼 전부 utf8입니다...

감사합니다.
최 초보드림 꾸~~~~~벅!!!

브라우저를 이용해서 입력하는 경우만(?) 문제가 생기니까
혹시 입력할 때 사용하는 페이지는 앞에 utf8로 설정한 html 문서와는 달리 문자 인코딩이 utf8이 아니지 않을까 하는 ( 설정을 하지 않았을지도 모른다는) 생각이 들어서요.

dhchoi

작성: 2009.10.08.(Thu) - 09:12

수정: 2017.05.03.(Wed) - 12:37

In reply to by wildapple

귀찮으실텐데도 불구하고 답변해 주셔서 감사합니다.
현재는 입력하는 html파일과 입력해 주는 php파일 두개만 있습니다.

html파일은 위에서 보시는 바와 같이 meta tag에 분명히 utf-8로 설정되어 있구요
입력해 주는 php 파일에는 <? php code ~~~~ 입력해라는 sql문.... ?> 달랑 이렇게만 들어 있습니다.
혹시, sql의 insert문에서도 지정할 수 있는 방법이 있을까요???

며칠째 여러분을 괴롭혀 드려서 정말 죄송합니다만
꼭!!! 도움을 부탁드립니다.
감사합니다.
최 초보 드림 꾸~~~~~벅!!!!

eunchul

작성: 2009.10.08.(Thu) - 10:37

수정: 2017.05.03.(Wed) - 12:39

In reply to by dhchoi

phpMyAdmin 에서는 UTF-8 으로 제대로 전송되는걸 봐서는 소스코드의 인코딩 문제가 맞는것 같습니다.
그러면 이것을 한번 확인해 주시기 바랍니다.
지금 company table에 데이터를 입력하는 php code 에서, mb_detect_encoding() 함수를 이용해서 해당 변수의 인코딩을 확인해 보세요.
예를 들면, HTML form 에서 name 이라는 값을 확인하시려면,
<?php 
  echo mb_detect_encoding($_REQUEST['name'], "UTF-8, EUC-KR, ASCII"); 
?>
로 해보시면 됩니다. 그러면 전송된 데이터(name 변수) 의 인코딩을 알수 있습니다.

일러주신 그대로 php code(check.pho)를 작성하여 파폭과 M$ 익스플로러에서 실행하였더니 UTF-8 얌전하게 위의 메세지만 덜렁 나타납니다.
도저히 이해가 안됩니다.

좀 더 도와 주세요.....
꼭!!!꼭!!! 부탁드립니다.
감사합니다.
최 초보 드림 꾸~~~~~~벅!!!

그 동안 도와 주신 모든 분들께 진심으로 감사드립니다. 감사의 절 받으세요..... OZL 됐습니다.
다른건 다 똑 같이 했구요... 다만 입력하는 php code에서 insert문 앞에
mysql_query("set names utf8"); 
이 문장을 넣고 실행 하였더니 터미널에서도 제대로 보이고 또 putty를 사용해서도 제대로 보입니다.

정말 기쁩니다. 며칠을 고생했는지....
그 동안 도와 주신 모든 분들께 진심으로 다시 한번 감사드립니다.
감사합니다.
최초보 드림 꾸~~~~~~벅!!!!