MySQL 4.1/PHP 4에서 문자 세트 문제...
글쓴이: 사랑천사 / 작성시간: 일, 2007/01/07 - 3:31오전
안녕하세요?
상황은 이렇습니다.
가능한 모든 설정을 했는데도 PHP에서는 euckr이나 latin1로 동작하지 않고 utf8로 무조건 동작합니다.그런 바람에 DB자료는 모두 latin1인데 읽어 오는 자료는 utf8로 변환 되서 나오는 바람에 웹브라우저에서 결과 확인시 전혀 알아 볼 수 없게 께져서 나옵니다. 그리고 폼에 한글을 넣으면 역시나 문자 세트 문제로 처리가 안 되고 오류를 냅니다.(SQL오류.)
코드 번호는 1267입니다.
php.ini, httpd.conf모두에 기본 문자셋을 euckr로(EUC-KR) 설정 해 주엇고
-- my.cnf --
# /etc/mysql/my.cnf: The global mysql configuration file. # $Header: /var/cvsroot/gentoo-x86/dev-db/mysql/files/my.cnf-4.1,v 1.3 2006/05/0 5 19:51:40 chtekk Exp $ # The following options will be passed to all MySQL clients [client] #password = your_password port = 3306 socket = /var/run/mysqld/mysqld.sock [geshifilter-mysql] character-sets-dir=/usr/share/mysql/charsets default-character-set=latin1 [mysqladmin] character-sets-dir=/usr/share/mysql/charsets default-character-set=latin1 [mysqlcheck] character-sets-dir=/usr/share/mysql/charsets default-character-set=latin1 [mysqldump] character-sets-dir=/usr/share/mysql/charsets default-character-set=latin1 [mysqlimport] character-sets-dir=/usr/share/mysql/charsets default-character-set=latin1 [mysqlshow] character-sets-dir=/usr/share/mysql/charsets default-character-set=latin1 [myisamchk] character-sets-dir=/usr/share/mysql/charsets [myisampack] character-sets-dir=/usr/share/mysql/charsets # use [safe_mysqld] with mysql-3 [mysqld_safe] err-log = /var/log/mysql/mysql.err # add a section [mysqld-4.1] or [mysqld-5.0] for specific configurations [mysqld] character-set-server = latin1 default-character-set = latin1 user = mysql port = 3306 socket = /var/run/mysqld/mysqld.sock pid-file = /var/run/mysqld/mysqld.pid log-error = /var/log/mysql/mysqld.err basedir = /usr datadir = /data/server/DB/mysql skip-locking key_buffer = 32M max_allowed_packet = 8M table_cache = 128 sort_buffer_size = 32MB net_buffer_length = 16K read_buffer_size = 512K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 32M language = /usr/share/mysql/korean # security: # using "localhost" in connects uses sockets by default # skip-networking bind-address = 127.0.0.1 log-bin server-id = 1 # point the following paths to different dedicated disks tmpdir = /tmp/ #log-update = /path-to-dedicated-directory/hostname # you need the debug USE flag enabled to use the following directives, # if needed, uncomment them, start the server and issue # #tail -f /tmp/mysqld.sql /tmp/mysqld.trace # this will show you *exactly* what's happening in your server ;) #log = /tmp/mysqld.sql #gdb #debug = d:t:i:o,/tmp/mysqld.trace #one-thread # uncomment the following directives if you are using BDB tables #bdb_cache_size = 4M #bdb_max_lock = 10000 # the following is the InnoDB configuration # if you wish to disable innodb instead # uncomment just the next line #skip-innodb # # the rest of the innodb config follows: # don't eat too much memory, we're trying to be safe on 64Mb boxes # you might want to bump this up a bit on boxes with more RAM innodb_buffer_pool_size = 16M # this is the default, increase it if you have lots of tables innodb_additional_mem_pool_size = 2M # # i'd like to use /var/lib/mysql/innodb, but that is seen as a database :-( # and upstream wants things to be under /var/lib/mysql/, so that's the route # we have to take for the moment #innodb_data_home_dir = /var/lib/mysql/ #innodb_log_arch_dir = /var/lib/mysql/ #innodb_log_group_home_dir = /var/lib/mysql/ # you may wish to change this size to be more suitable for your system # the max is there to avoid run-away growth on your machine innodb_data_file_path = ibdata1:10M:autoextend:max:128M # we keep this at around 25% of of innodb_buffer_pool_size # sensible values range from 1MB to (1/innodb_log_files_in_group*innodb_buffer_p ool_size) innodb_log_file_size = 5M # this is the default, increase it if you have very large transactions going on innodb_log_buffer_size = 8M # this is the default and won't hurt you # you shouldn't need to tweak it set-variable = innodb_log_files_in_group=2 # see the innodb config docs, the other options are not always safe innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 [mysqldump] quick max_allowed_packet = 16M [mysql] # uncomment the next directive if you are not familiar with SQL #safe-updates #set-variable = character_set_client = latin1 #set-variable = character_set_results = latin1 [isamchk] key_buffer = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [myisamchk] key_buffer = 20M sort_buffer_size = 20M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
Forums:
본문이 길어 꼼꼼히
본문이 길어 꼼꼼히 읽어보진 못했습니다만...
제 경우 MySQL 4.1 이상의 한글 문제는 아래 2가지 방법으로 모두 해결이 가능했으니 한번 참고해보시기 바랍니다.
-. mysql 4.1.X 이상에서 기본언어가 한글로 설정되지 않았을때의 설정 변경 방법.
# my.cnf 는 서버에 따라 위치가 다를 수 있으므로 확인요망.
# init_connect, skip-character-set-client-handshake 옵션은 MySQL 버젼에 따라 한가지만 사용하면 됨.
# 주의) 이 옵션은 [mysqld] 영역에 들어가야 하며 다른 곳에 들어가면 에러가 발생함.
vi /etc/my.cnf
[mysqld]
default-character-set=euckr
### mysql 4.1.2 (28 May 2004) 이상에서만 동작함. PHP에서 "set names euckr"쿼리를 줄 필요가 없어짐.
init_connect='set names euckr'
### mysql 4.1.15 이상에서만 동작함. PHP에서 "set names euckr"쿼리를 줄 필요가 없어짐.
#skip-character-set-client-handshake=1
[client]
default-character-set=euckr
[mysqldump]
default-character-set=euckr
# MySQL 재시작
/etc/init.d/mysqld restart
# MySQL 서버에 연결후 설정이 한글로 뜨는지 확인한다.
mysql> show variables like '%char%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | euckr |
| character_set_connection | euckr |
| character_set_database | euckr |
| character_set_results | euckr |
| character_set_server | euckr |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/korean |
+--------------------------+--------------------+
7 rows in set (0.00 sec)
# PHP 에서도 간단한 스크립트를 만들어 위 설정과 동일한지 확인한다.
-. 일부 배포판(CentOS 특정버젼)의 RPM 버젼에서 init_connect, skip-character-set-client-handshake 옵션이 적용되지 않는 문제.
: 아래 제로보드의 경우처럼 PHP의 mysql_connect() 다음에 "set names ..."쿼리를 실행시키면 해결 됩니다.
zboard/lib.php
272 function dbconn() {
~
287 // [2005-07-08] MySQL 4.1 charset
288 mysql_query("set names euckr") or error(mysql_error);
289
290 return $connect;
아.. 이거 정말 감사합니다.
제가 생각 못 한 것들이 잇엇군요.
init_connect는 mysqld에 섹션에 넣어야 한다는 거가 일단 그랫꼬..
default-character-set 변수를 client 섹션에도 써 줄 수 잇다는 것을 잊엇군요. 대충 그렇게 해 주니 잘 되네요...
근대... 테이블이나 DB에 잇는 자료 자체는 잘 처리가 되서 표시가 되는데 COMMENT(설명 붕인 것.)는 아무리 해도 깨지는건 계속 깨지네요.. 그래서 ALTER TABLE `tblname` CHARSET=latin1;
이렇게 해도 데이터는 잘 변환이 되는데 COMMENT는 안 되네요.
이런건 어덯게 방법이 없겠죠? 으유. 그래서 안 되는건 일단 그냥 다 COMMENT를 ''(공백) 으로 설정 했습니다.
ALTER TABLE `tblname` COMMENT='';
으유...
힘듭니다.
아무튼 정말 감사합니다... 애휴...
----
Lee Yeosong(이여송 사도요한)
E-Mail: yeosong@gmail.com
MSN: ysnglee2000@hotmail.com
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)
사람천사
저는 아래 옵션으로
저는 아래 옵션으로 처리해서 한글명 첨부파일도 정상적으로 처리되고 DB 연동도 정상처리됨.
설치내역
Server version: Apache/1.3.34 (Win32)
X-Powered-By: PHP/4.4.2 ( Content-type: text/html; charset=euc-kr )
mysql Ver 12.22 Distrib 4.0.26, for Win32 (ia32)
*** 서비스로 기동하는 방법이 되지 않아 기동 옵션으로 처리시 아래 옵션으로 처리하면 됨.
--language=korean --skip-innodb --skip-bdb --default-character-set=euc_kr
설정후 mysql 에서 조회내역
mysql> \s
Client characterset: latin1
Server characterset: euc_kr
Server 쪽만 저게
Server 쪽만 저게 되서는 안 되지요. 일단 저도 다른 방법으로 성공 하긴 했는데 흠흠. 모르겠습니다. 저 방법 비슷한 것은 오래 전에 썼었는데. 지금은 또 5.0 대로 올라왔고 4.1과 비슷하네요 처리 방법ㅇ.ㄴ
----
Lee Yeosong(이여송)
E-Mail: yeosong@gmail.com
HomePage: http://lys.lecl.net:88/
Wiki(Read-Only): http://lys.lecl.net:88/wiki/
Blog: http://lys.lecl.net:88/blog
MSN: ysnglee2000@hotmail.com
----
절이 싫으면 중이 떠나는 것이 아니라, 절이 싫으면 중이 절을 부숴야 한다.
사람천사
댓글 달기