MySQL 4.1/PHP 4에서 문자 세트 문제...

사랑천사의 이미지

안녕하세요?

상황은 이렇습니다.
가능한 모든 설정을 했는데도 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

이렇게 되어 있습니다.(my.cnf내용) 그런데 여기에 character_set_client나 character_set_results를 설정 할 경우 unknown variable 라고 하면서 mysqld나 mysql이 동작하지 않습니다. 어느 섹션에 넣느냐에 따라 어떤 녀석이 안 뜨는지는 정해지고요. client섹션에 넣으니 mysql이 안 떴습니다. mysql섹션도 역시 마찬가지입니다. mysqld에 넣으면 mysqld가 안 떴고요. 그래서 set-variable = character_set_client = latin1 과 같은 형식으로도 해 보앗찌만 여전히 안 되엇습니다. 같은 메세지 나오면서 서버나 클라이언트가 시작이 안 되더라고요. 왜 제가 저 변수들을 건드렸냐면... phpmyadmin에서 환경 설정 상황표를 보니 저 변수들이 전부 utf8로 설정 되어 있더라고요. 그리고 어떤 녀석은 글로벌은 latin1이고 현재 세션에 설정된 변수는 utf8이더군요. 직접 쿼리를 주면 설정이 되지만 my.cnf에 넣으면 안 되네요. 결론적으로 PHP에서 MySQL 접속시에 보내는 자료와 받는 자료의 인코딩을 모두 utf8로 해서 보내는데 서버는 latin1이 기본 설정입니다. 안에 잇는 데이터가 워낙 많아서 서버 설정이나 DB의 자료를 전부 변환 할 수도 없는 상태입니다. 그리고 무엇보다 돌아가는 프로그램들이(Web...) EUC-KR기반이고 해서 UTF-8로 자료 인코딩을 바꾹 되면 무슨 일이 벌어질 지 짐작이 안 갑니다. 뭐 깨지겠죠. 그리고 여기 돌아가는게 소유권이 다 저한태 잇는게 아니라서 역시나 데이터를 다 UTF-*로 바꾸라고 강요 할 수도 없습니다. 어떻게 하면 EUC-KR이나 latin1로 쓸 수 잇을까요... OS는 젠투를 쓰고 잇고 깔린 Apache아 PHP, MySQL은 모두 ebuildㄹ 직접 컴파일 하여 설치된 것입니다. 제가 소스 구해서 빌드한 것이 아니기 때문에 더 난감한 상태입니다. 이 문제 때문에 PHP메뉴얼에 MySQL메뉴얼에 아파치 메뉴얼까지 안 보던 것들도 다시 다 보고 이거 저거 해 봤지만 안 되었습니다. 뭐 init_connect 환경변수를 "SET NAMES euckr" 식으로 설정 해 주는 방법도 있다고 해서 그것도 해 보았지만 역시나 unknown variable 메세지 뜨면서 mysql이 안 떴습니다. 뭐... PHP에선 어떻게 반응을 하는지 모르겠지만, 우선 mysql 콘솔 클라이언트도 안 뜨는 걸로 봐서 문제가 생기지 않을까 생각됩니다 으으. 뭔가 해결 할 방법이 있으면 좋겠는데어떻게 하면 좋을까요? 글을 너무 길게 써서 죄송합니다.[/geshifilter-mysql]
ibin의 이미지

본문이 길어 꼼꼼히 읽어보진 못했습니다만...

제 경우 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
----
웃음... 행복... 평화... (진정한...) 희망... 사랑... 이 세상 모든것이 그렇다면 얼마나 좋을까...(꿈 속의 바램일 뿐인가...)

사람천사

seeroo의 이미지

저는 아래 옵션으로 처리해서 한글명 첨부파일도 정상적으로 처리되고 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 쪽만 저게 되서는 안 되지요. 일단 저도 다른 방법으로 성공 하긴 했는데 흠흠. 모르겠습니다. 저 방법 비슷한 것은 오래 전에 썼었는데. 지금은 또 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
----
절이 싫으면 중이 떠나는 것이 아니라, 절이 싫으면 중이 절을 부숴야 한다.

사람천사

댓글 달기

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