utf-8 사용시 설정 - db의 입출력을 완벽하게 utf-8로(보완수정)
아래 tron 님의 팁을 보완수정 하였습니다..
아래 tron 님의 팁을 적용하고보니 한글의 입출력은 잘 되는데,
common.lib.php 파일의 109번 라인에서 에러를 보이더군요..
그 부분과 설치과정에서의 utf-8 처리문제를 보완수정 한것입니다..
보완수정한 부분을 제외하면 아래 tron 님의 글을 그대로 인용했습니다..... tron님 죄송 ... ^^
일단 모든 환경과 실제 주고 받는 데이터를 모두 utf-8로 하기 위한 방법 입니다.
이 방법은
php 5.1.1
mysql 5.0.18
apache 2.0.55
서버의 모든 환경설정 = utf8
의 환경에서 테스트 되었습니다.
일단 문제점은,
1. utf-8 버전을 받아 사용해도 실제 데이터는 utf-8로 저장되지 않으므로 서버의 환경이 utf-8이라도 db에 입력되되는 데이터는 utf-8의 형식이 아니다..
2. 1번의 문제로 phpmyadmin등에서 데이터가 깨져 보인다.
3. 데이터 입력시 utf-8로 변환을 해도 출력시 db에서 꺼내올 때 데이터를 기본 형식으로 처리해서 데이터가 깨진다. - 물론 영어는 안깨진다.
이 세 가지 문제점을 해결하기 위한 수정 입니다.
=========================================================
그누보드 디렉토리/common.php 파일의 10번줄 바로 아래에
@mysql_query("set names utf8");
이것 한줄 추가해 줍니다..
다음..그누보드 디렉토리/lib/common.lib.php 파일에서,
// DB 연결
function sql_connect($host, $user, $pass)
{
return @mysql_connect($host, $user, $pass);
}
// DB 선택
function sql_select_db($db, $connect)
{
return @mysql_select_db($db, $connect);
}
이 부분을 아래와 같이 수정 합니다.
// DB 연결
function sql_connect($host, $user, $pass)
{
@mysql_query("set names utf8"); // 한글문제해결을위하여 추가
return @mysql_connect($host, $user, $pass);
}
// DB 선택
function sql_select_db($db, $connect)
{
@mysql_query("set names utf8"); // 한글문제해결을위하여 추가
return @mysql_select_db($db, $connect);
}
=======================================================
이렇게 하면,
db접속 후에 모든 데이터의 처리를 utf-8로 합니다. 주의할 점은 mysql 버전이 5 이상의 경우 utf-8이 아니라 utf8 입니다. 이렇게 하고 데이터를 불러오거나 저장을 하면 db에도 실제로 utf-8현식으로 저장이 됩니다.
주의하실 점은 이미 기존의 데이터가 있는 상황에서 @mysql_query("set names utf8");을 적용하면 기존의 쌓인 데이터는 실제 utf-8이 아니므로 출력 부분에서도 깨져 보입니다. 따라서 초기 세팅시에 위 부분을 수정하시고 인스톨을 진행하면 모든 부분에서 utf-8로의 입출력이 가능 합니다.
---------------------------------------------------------------------------------------------------------------------------
또한, mysql 5 이상의 환경에서 인스톨시 보다 안전하게 인스톨을 위해서는 인스톨 디렉토리의 sql_gnuboard4.sql 파일을 열어서 각 테이블 생성 DDL의 마지막에,
type=MyISAM;
이 부분을
ENGINE=MyISAM DEFAULT CHARSET=utf8;
이렇게 해 주시면 테이블 또한 확실하게 utf-8형식으로 생성이 됩니다.
저의 경우는 이부분은 안해도 되더군요...^^
---------------------------------------------------------------------------------------------------------------------------------
설치할때 그냥 설치하면 기본으로 입력되는 내용들이 모두 깨지는데,
그누보드폴더/install/install_db.php 파일의 쿼리부분 몇군데에
@mysql_query("set names utf8");
를 넣어주면 설치시에 기본으로 디비에 입력되는 내용들도 모두 한글로 입력이 됩니다.
(첨부파일 참조)
첨부파일을 압축을 풀면 파일이 세개가 나옵니다..
install_db.php 파일은 install 폴더에
common.php 파일은 그누보드폴더에
common.lib.php 파일은 그누보드/lib 폴더에
넣어주시면 위의 수정과정은 하시지 않아도 됩니다..
-----------------------------------------------------------------------------------------------------------------------------------
인스톨 하기 전에 이러한 수정을 하고난 후에 설치를 하면 완벽하게 utf-8형식으로 데이터를 입출력 할 수 있습니다.
위의 첨부 이미지처럼 phpmyadmin 에서도 한글이 깨짐없이 출력 됩니다..
db 접속하는 부분이 위 수정 파일 말고 또 어느 부분에 있는지는 아직 제가 다 파악을 못했습니다만, 대부분의 db접속후에 실제 쿼리를 사용하기 전에 먼저 set names utf8 을 쿼리로 날려 주시면 db는 모든 데이터의 입출력을 utf-8형식으로 처리 합니다.
여담..
mysql 5 부터 utf-8 이 아니라 utf8로 바뀌었습니다. euc-kr도 euckr로 바뀌었구요... 따라서 db 환경이나 db 테이블 생성 같은 경우에는 utf8이나 euckr을 써야 하고 php나 apache에서는 그대로 utf-8이나 euc-kr로 써야 합니다... 서버 구축시 의외로 이 부분에서 많은 분들이 실수를 하시더군요...
그렇다고 config.php 파일에서
$g4[charset] = "UTF-8";
이부분을 utf8 로 수정하는것은 하지 마세요...
이부분은 아파치에서 담당하니까 서버마다 다를수도 있어요...
UTF-8 이냐, utf-8 이냐, 아니면 utf8 이냐 하는것은,
apache 의 http.conf 에서는 UTF-8 을
php 의 php.ini 에서는 utf-8 을
mysql 의 my.ini 에서는 utf8 을
사용하시면 됩니다....
아래 tron 님의 팁을 적용하고보니 한글의 입출력은 잘 되는데,
common.lib.php 파일의 109번 라인에서 에러를 보이더군요..
그 부분과 설치과정에서의 utf-8 처리문제를 보완수정 한것입니다..
보완수정한 부분을 제외하면 아래 tron 님의 글을 그대로 인용했습니다..... tron님 죄송 ... ^^
일단 모든 환경과 실제 주고 받는 데이터를 모두 utf-8로 하기 위한 방법 입니다.
이 방법은
php 5.1.1
mysql 5.0.18
apache 2.0.55
서버의 모든 환경설정 = utf8
의 환경에서 테스트 되었습니다.
일단 문제점은,
1. utf-8 버전을 받아 사용해도 실제 데이터는 utf-8로 저장되지 않으므로 서버의 환경이 utf-8이라도 db에 입력되되는 데이터는 utf-8의 형식이 아니다..
2. 1번의 문제로 phpmyadmin등에서 데이터가 깨져 보인다.
3. 데이터 입력시 utf-8로 변환을 해도 출력시 db에서 꺼내올 때 데이터를 기본 형식으로 처리해서 데이터가 깨진다. - 물론 영어는 안깨진다.
이 세 가지 문제점을 해결하기 위한 수정 입니다.
=========================================================
그누보드 디렉토리/common.php 파일의 10번줄 바로 아래에
@mysql_query("set names utf8");
이것 한줄 추가해 줍니다..
다음..그누보드 디렉토리/lib/common.lib.php 파일에서,
// DB 연결
function sql_connect($host, $user, $pass)
{
return @mysql_connect($host, $user, $pass);
}
// DB 선택
function sql_select_db($db, $connect)
{
return @mysql_select_db($db, $connect);
}
이 부분을 아래와 같이 수정 합니다.
// DB 연결
function sql_connect($host, $user, $pass)
{
@mysql_query("set names utf8"); // 한글문제해결을위하여 추가
return @mysql_connect($host, $user, $pass);
}
// DB 선택
function sql_select_db($db, $connect)
{
@mysql_query("set names utf8"); // 한글문제해결을위하여 추가
return @mysql_select_db($db, $connect);
}
=======================================================
이렇게 하면,
db접속 후에 모든 데이터의 처리를 utf-8로 합니다. 주의할 점은 mysql 버전이 5 이상의 경우 utf-8이 아니라 utf8 입니다. 이렇게 하고 데이터를 불러오거나 저장을 하면 db에도 실제로 utf-8현식으로 저장이 됩니다.
주의하실 점은 이미 기존의 데이터가 있는 상황에서 @mysql_query("set names utf8");을 적용하면 기존의 쌓인 데이터는 실제 utf-8이 아니므로 출력 부분에서도 깨져 보입니다. 따라서 초기 세팅시에 위 부분을 수정하시고 인스톨을 진행하면 모든 부분에서 utf-8로의 입출력이 가능 합니다.
---------------------------------------------------------------------------------------------------------------------------
또한, mysql 5 이상의 환경에서 인스톨시 보다 안전하게 인스톨을 위해서는 인스톨 디렉토리의 sql_gnuboard4.sql 파일을 열어서 각 테이블 생성 DDL의 마지막에,
type=MyISAM;
이 부분을
ENGINE=MyISAM DEFAULT CHARSET=utf8;
이렇게 해 주시면 테이블 또한 확실하게 utf-8형식으로 생성이 됩니다.
저의 경우는 이부분은 안해도 되더군요...^^
---------------------------------------------------------------------------------------------------------------------------------
설치할때 그냥 설치하면 기본으로 입력되는 내용들이 모두 깨지는데,
그누보드폴더/install/install_db.php 파일의 쿼리부분 몇군데에
@mysql_query("set names utf8");
를 넣어주면 설치시에 기본으로 디비에 입력되는 내용들도 모두 한글로 입력이 됩니다.
(첨부파일 참조)
첨부파일을 압축을 풀면 파일이 세개가 나옵니다..
install_db.php 파일은 install 폴더에
common.php 파일은 그누보드폴더에
common.lib.php 파일은 그누보드/lib 폴더에
넣어주시면 위의 수정과정은 하시지 않아도 됩니다..
-----------------------------------------------------------------------------------------------------------------------------------
인스톨 하기 전에 이러한 수정을 하고난 후에 설치를 하면 완벽하게 utf-8형식으로 데이터를 입출력 할 수 있습니다.
위의 첨부 이미지처럼 phpmyadmin 에서도 한글이 깨짐없이 출력 됩니다..
db 접속하는 부분이 위 수정 파일 말고 또 어느 부분에 있는지는 아직 제가 다 파악을 못했습니다만, 대부분의 db접속후에 실제 쿼리를 사용하기 전에 먼저 set names utf8 을 쿼리로 날려 주시면 db는 모든 데이터의 입출력을 utf-8형식으로 처리 합니다.
여담..
mysql 5 부터 utf-8 이 아니라 utf8로 바뀌었습니다. euc-kr도 euckr로 바뀌었구요... 따라서 db 환경이나 db 테이블 생성 같은 경우에는 utf8이나 euckr을 써야 하고 php나 apache에서는 그대로 utf-8이나 euc-kr로 써야 합니다... 서버 구축시 의외로 이 부분에서 많은 분들이 실수를 하시더군요...
그렇다고 config.php 파일에서
$g4[charset] = "UTF-8";
이부분을 utf8 로 수정하는것은 하지 마세요...
이부분은 아파치에서 담당하니까 서버마다 다를수도 있어요...
UTF-8 이냐, utf-8 이냐, 아니면 utf8 이냐 하는것은,
apache 의 http.conf 에서는 UTF-8 을
php 의 php.ini 에서는 utf-8 을
mysql 의 my.ini 에서는 utf8 을
사용하시면 됩니다....
|
댓글 작성
댓글을 작성하시려면 로그인이 필요합니다.
로그인하기
댓글 38개
이런 에러가 납니다~!
utf-8 환경에 설치해야 합니다..
이때 웹에 올린 것은 먼저 백업해서 저장해 두어야 합니다
저같은 경우 신청하고 하루만에 변경시켜주더군요.
약간 두려워서...
특히 DB문제...
많은 도움을 받습니다.
감사합니다.
Photofly님 설명대로...
common.php, /lib/common.lib.php 위 본문과 같이 수정하고, install_db.php 다운받아 덮어쓰고...
딱 여기까지만... (첨부파일에 다 있는줄 알았으면 안했을... 게으름대마왕... ㅡ.ㅡ;)
ENGINE=MyISAM DEFAULT CHARSET=utf8; 바꾸지 않았구요...
OS : Windows 2003
Apache 2.0.55 : AddDefaultCharset 설정 안함
PHP 5.1.2 : euc-kr
MySQL 5.0.18 : euckr
DB 생성시 collation : utf8_general_ci 로 했구요...
'URL을 항상 UTF-8로 보냄' check/uncheck된 IE에서 '회원가입/글쓰기/파일첨부'만 테스트 해봤습니다. ㅡ.ㅡ;
안깨지고 잘 보이네요... phpmyadmin에서도 잘 보이고...
다만... '일부' alert() 사용한 대화창에서 글자가 깨져보이긴 합니다만... iconv()로 땜질은 되더군요.
(그렇다고 다 찾아서 고칠수도 없는 노릇이고... 그냥 테스트만 해봤습니다... ^^;)
나중에 어느부분에서 어떻게 문제가 와르르 쏟아질지도 모르고...
제가 아직 모르는게 많아서 현재로서는 그냥 euc-kr로 사용하려고 합니다만...
고수분들은 여기서 어떤것들을 더 체크해보시는지요???
그누보드+PHP 다루는게 점점 재미있어져서 큰일이네요... ㅡ.ㅡ;
이상 허접한 테스트기였습니다.
다만... 'ㅌ'자는 일부(?) 대화창에서 그래도 깨져서 나옵니다.
이대로 하나의 서버에서 euc-kr 버전과 utf-8 버전을 같이 돌려도 될런지...
내공이 쌓이는족족 이것저것 테스트해보아야 겠습니다. ^^;
얼마전 Photofly 님께서 PHP 5.1.2 사용시 썸네일 생성 문제가 있다라고 하셨을땐,
무슨말인지 몰랐는데... 갤러리스킨 말씀이셨던듯... ㅡ.ㅡ;
저는 그냥 php_gd2.dll만 5.1.1 릴리즈에 들어있는것으로 덮어씌워서 해결했습니다. ㅡ.ㅜ;
고수님들이 계셔서 짧은 시간에 많은것을 배울 수 있는것 같습니다. 감사합니다~ ^^;
다만, euc-kr 버전은 phpmyadmin 에서 한글이 깨지더군요..
저도 그냥 php_gd2.dll만 5.1.1 릴리즈에 들어있는것으로 덮어씌워서 해결하려다가 걍 버전다운 해버렸습니다.
도움이 되셨다니 다행입니다....^^
저두 이번에 일본어 사이트 제작하면서 그쪽으로 바꿨습니다.
좀 놀라운것은 대부분 유명한 호스팅사들이 다 유니코드 디비 지원이 안된다는 점이었습니다...ㅠㅠ
벤처라 좀 불안하긴 하지만..그래도 관리에 이것저것 괜찮은 기능이 있더라구요.
제가 하는 호스팅도 아니니 선전은 아니구요 그냥 정보 알려드립니다.
php.ini 의 수정도 필요한 것이 아닌지요?
-퍼온 글 ------------------------------------------------------------
종래에는 홈페이지가 자국인들만 이용할 것을 예상하고 제작하므로써 외국인 즉, 비한글 사용자들에 대한 서비스를 미쳐 염두에 두지 못하므로써 한글이 ?????$%^&( 처럼 깨져 보이는 무지함을 보였던 것이 사실입니다.
이제는 홈페이지 제작도 유니코드(UTF-8) 인코딩 방식이 세계적 추세이며 이러한 추세에 맞추어 MySql도 기본언어를 utf8(UTF-8 인코딩) 방식으로 변경하였으므로, 홈페이지를 종래 euc-kr 등 한글로만 표기하던 방식도 UTF-8 인코딩 방식으로 업데이트해야 할 때 입니다. UTF-8 인코딩 방식은 한국어, 일어, 중국어, 태국어, 아랍어 등 만국어 표기가 가능한 방식입니다.
APM에서 UTF-8을 구현하려면 꽤 많은 부분을 수정해야 합니다 .
다음은 APM에서 UTF-8 구현 방법과 소스코드를 첨부합니다.
적용 환경
----------------
OS : WinXP SP2
Apache : httpd-2.0.52-3
PHP : php-5.0.3
MySQL : mysql-4.1.11
----------------
1. apache 환경파일 편집 (httpd.conf)
2. php 환경파일 편집 (php.ini)
3. mysql 환경파일 편집 (my.cnf)
4. apache, mysql 서비스 재시작
5. mysql에서 캐릭터셋 확인 및 디비생성
6. php 소스코드에 mysql_query("set names utf8;"); 함수 추가
7. php 소스에 한글문자열이 있으면 파일저장할때 UTF-8 파일형식으로 저장
8. 웹브라우즈의 보기-인코딩-UTF-8로 선택
1. /etc/httpd/conf/httpd.conf 에서 캐릭터셋 수정
/*------------
AddDefaultCharset UTF-8
2. /etc/php.ini 에서 캐릭터셋 수정
/*------------
;default_charset = "iso-8859-1"
default_charset = "utf-8"
3. /etc/my.cnf 에서 캐릭터셋 수정
/*------------
[client]
#password = your_password
default-character-set=utf8
[mysqld]
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
4. 환경변수를 모두 수정후 apache 및 mysql 서비스 재시작
/*------------
5. mysql에서 캐릭터셋 확인
/*------------
# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 247 to server version: 4.1.10a
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use test
Database changed
mysql> 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 | /usr/share/mysql/charsets/ |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
| concurrent_insert | ON |
| connect_timeout | 5 |
+---------+-----------+
12 rows in set (0.00 sec)
* MySql에서 데이터베이스 생성
mysql>CREATE DATABASE 디비명 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
1. httpd.conf 에서 기본언어설정안함
# AddDefaultCharset UTF-8
2. php.ini 에서 기본언어설정안함
; default_charset = "iso-8859-1"
; default_charset = "utf-8"
3. my.cnf 에서 캐릭터셋 수정
[client]
#password = your_password
default-character-set=utf8
[mysqld]
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
==================================================
위 상태에서 아래 두가지 버전모두 운영이 가능합니다.
그누보드4 UTF-8 = 한글 입출력 아무이상없음,
그누보드4 EUC-KR = 한글 정상출력(phpmyadmin 에서만 한글이 깨짐),
==================================================
httpd.conf 에서
AddDefaultCharset UTF-8 로 지정할경우는
EUC-KR 버전은 한글 깨지는데 브라우저에서 인코딩을 지정하면 정상출력,
새로고침하면 다시 한글깨짐. 이렇게 되더군요...
참고하시라고 올려드립니다..
저는 외국에 있는 서버에 호스팅을 받고 있는데..
요즘 외국 서버들은 거의 대부분 UTF-8만 지원하나봐요..
몇군대 알아봤는데 그렇더라고요..
이번에 서버 옮기면서 엄청 고생했습니다. --;;
저 같은 경우는 Table을 생성할때 꼭 ENGINE=MyISAM DEFAULT CHARSET=utf8;을 사용하여 생성하여야 합니다.
그누보드4 UTF 버젼에서
install/sql_gnuboard4.sql 외 한군데 더 고쳐줘야 하더군요..
admin/sql_write.sql 입니다
sql_write.sql에서 type=MyISAM; 이 부분을 ENGINE=MyISAM DEFAULT CHARSET=utf8; 으로 바꿔줘야..
새로운 게시판 생성 할 때 제대로 된 Collation으로 생성이 되더군요.
한참 해맸는데.. 언제나 그렇듯 너무 간단한 한줄로 해결이 되요.. --;;
서버의 환경에 따라서 좀 다른가봐요...저는 sql 파일은 건드리지 않아도 잘되거든요...^^
=========================================================
UTF-8 환경의 서버에 그누보드4 EUC-kR 버전을 설치하실때는
위 본문글 내용에서
@mysql_query("set names utf8");
이 소스를
@mysql_query("set names euckr");
로 바꿔서 본문에 제시한 부분들에 넣어주고 설치하면
그누보드4 EUC-kR 버전도 역시 한글의 입출력이
phpmyadmin 에서도 그누보드에서도 이상없이 이루어지더군요...
참고하시라고 추가로 올려 드립니다....
http://www.sir.co.kr/bbs/tb.php/g4_tiptech/2497
해결했습니다. 모두 감사합니다.
많은 도움이 되었습니다~~**
commond파일 수정 오케이~
그럼 업데이트가 아니잖아요...-_-;;
수정안하고도 되는
제대로 된버전 안나오나....
그누보드 제작 팀에서 적극 수렴하시고, 더 발전시켜서 완벽한 UTF-8 버전의
그누보드 개발 및 발표를 해주시면 좋겠습니다.
덕분에 윈도우XP=>우분투로 &
MySQL client version: 5.0.27=> MySQL client version: 5.0.51a로 이전 시키는데 잘 적용 하였습니다.
이문제로 요즘 고민이 많은데 많은 도움됬읍니다.