BOARD

문제 해결

PHP와 MySQL 연동 시 한글 깨짐 현상 원인 및 UTF-8 해결 방법

페이지 정보

profile_image
작성자 최고관리자
댓글 0건 조회 9회 작성일 26-10-14 17:35

본문

PHP와 MySQL 연동 시 한글 깨짐 현상 원인 및 UTF-8 해결 방법

PHP와 MySQL을 연동할 때 데이터베이스에 한글이 깨져서 저장되는 문제를 겪고 있는 운영자와 개발자를 위해, PHP 코드 내 세션 설정과 서버 설정 파일을 통한 구체적인 해결 방법을 알아봅니다.

PHP와 MySQL을 연동하여 데이터를 저장할 때 한글이 깨지거나 물음표로 저장되는 현상은 주로 데이터베이스 설정 및 연결 세션의 UTF-8 문자 인코딩 설정이 일치하지 않기 때문에 발생합니다.

웹 페이지 상에서는 UTF-8로 정상적으로 출력되더라도, 실제 데이터베이스 서버 내부의 인코딩 설정이나 PHP에서 MySQL로 연결되는 세션의 문자셋이 UTF-8로 지정되어 있지 않으면 데이터가 저장되는 과정에서 인코딩 불일치로 인해 문자가 깨지게 됩니다.

호스팅 서버 환경에서 PHP 코드를 통한 한글 깨짐 해결 방법

서버의 설정 파일을 직접 수정할 수 없는 호스팅 환경에서는 PHP 코드로 데이터베이스 연결 직후 세션 문자셋 쿼리를 실행하여 한글 깨짐 문제를 해결할 수 있습니다.

PHP 파일 내 세션 문자셋 설정 쿼리 추가

DB 연결(mysqli_connect)을 수행하는 PHP 파일에서 연결 객체 생성 후 아래의 쿼리 문을 추가합니다.

$dbconn = mysqli_connect("호스트네임(IP가능)", "사용자 아이디값", "사용자 비밀번호", "사용할 데이터베이스 이름");
mysqli_query($dbconn, "set session character_set_connection=utf8;");
mysqli_query($dbconn, "set session character_set_results=utf8;");
mysqli_query($dbconn, "set session character_set_client=utf8;");

적용 후 확인 방법

설정을 적용한 후 데이터베이스에 한글 데이터를 입력하고 정상적으로 저장 및 출력되는지 확인합니다.

자체 서버 MySQL 설정 파일(/etc/my.cnf)을 이용한 한글 인코딩 설정 방법

자체 서버를 직접 운영하는 환경에서는 데이터베이스에 연결할 때마다 PHP 코드에서 문자셋 쿼리를 매번 전송하는 것이 관리상 번거로울 수 있습니다. 이 경우 서버의 전역 설정 파일을 수정하여 한글 깨짐 현상을 해결할 수 있습니다.

1. /etc/my.cnf 파일 수정

서버의 /etc/my.cnf 파일을 열어 아래 구문을 추가합니다.

[mysqld]
collation-server=utf8_unicode_ci
default-character-set=utf8
character-set-server=utf8
init_connect=set collation_connection=utf_unicode_ci
init_connect=set names utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

2. MySQL 서비스 재시작

설정을 반영한 뒤에는 데이터베이스 서버인 mysqld를 재시작해야 합니다.

PHP와 MySQL 연동 시 한글 깨짐 현상 해결 방법

PHP와 MySQL을 연동할 때 데이터베이스에 한글이 깨진 상태로 저장되는 문제는 주로 데이터베이스 및 연결 세션의 UTF-8 설정 문제로 발생합니다. 운영 환경(자체 서버 또는 호스팅 환경)에 따라 아래의 두 가지 방법으로 해결할 수 있습니다.

1. 호스팅 환경: PHP 파일에서 세션 문자셋 설정하기

호스팅을 이용하는 경우처럼 서버 설정 파일을 직접 수정하기 어렵다면, 데이터베이스에 접속하는 PHP 파일에서 연결 직후 아래의 쿼리를 추가하여 강제로 인코딩을 설정합니다.

$dbconn = mysqli_connect("호스트네임(IP가능)", "사용자 아이디값", "사용자 비밀번호", "사용할 데이터베이스 이름");
mysqli_query($dbconn, "set session character_set_connection=utf8;");
mysqli_query($dbconn, "set session character_set_results=utf8;");
mysqli_query($dbconn, "set session character_set_client=utf8;");

2. 자체 서버 운영 환경: /etc/my.cnf 파일 수정하기

매번 PHP 파일마다 쿼리를 추가하는 방식이 관리상 불편하다면 서버 설정 파일을 수정할 수 있습니다. 자체 서버를 운영 중인 경우 /etc/my.cnf 파일에 아래 구문을 추가한 뒤 mysqld를 재시작합니다.

[mysqld]
collation-server=utf8_unicode_ci
default-character-set=utf8
character-set-server=utf8
init_connect=set collation_connection=utf_unicode_ci
init_connect=set names utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

운영 환경별 한글 깨짐 해결 가이드

데이터베이스에 한글이 깨져 저장되는 문제는 인코딩 설정 불일치로 발생합니다. 본인의 서버 관리 권한에 따라 아래 기준을 선택하세요.

1. 호스팅 환경 (설정 파일 수정 권한 없음)

  • 선택 기준: 서버의 /etc/my.cnf 파일을 직접 수정할 수 없는 경우.
  • 다음 행동: DB에 접속하는 PHP 파일 내 mysqli_connect 직후에 아래 쿼리들을 추가하여 세션 문자셋을 강제로 UTF-8로 설정합니다.
    mysqli_query($dbconn, "set session character_set_connection=utf8;");
    mysqli_query($dbconn, "set session character_set_results=utf8;");
    mysqli_query($dbconn, "set session character_set_client=utf8;");

2. 자체 서버 환경 (설정 파일 수정 권한 있음)

  • 선택 기준: 서버의 /etc/my.cnf 파일을 직접 수정할 수 있는 경우.
  • 다음 행동: /etc/my.cnf 파일에 아래 설정을 추가하고 systemctl restart mysqld 명령어로 서비스를 재시작합니다. 적용 후 SHOW VARIABLES LIKE 'char%'; 쿼리로 변경 사항을 확인하십시오.
    [mysqld]
    collation-server=utf8_unicode_ci
    default-character-set=utf8
    character-set-server=utf8
    init_connect=set collation_connection=utf_unicode_ci
    init_connect=set names utf8
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8

실전 FAQ

Q. 설정 적용 후에도 한글이 깨진다면 어떻게 하나요?

  • 예외 상황: 데이터베이스 연결 시 설정뿐만 아니라, 웹 페이지 자체의 인코딩(meta charset="utf-8")이 맞는지 확인해야 합니다. 또한, 이미 깨진 상태로 저장된 데이터는 설정을 수정해도 복구되지 않으므로, 설정을 마친 후 새로 데이터를 입력하여 정상 저장 여부를 확인하십시오.

Q. my.cnf 수정 후 서버가 시작되지 않습니다.

  • 대안: 설정 파일의 문법 오류일 가능성이 높습니다. 수정 전 반드시 기존 my.cnf 파일을 백업하고, 서비스 재시작 시 오류 메시지를 확인하여 잘못 입력된 구문을 제거하거나 이전 상태로 복구하십시오.

함께 보면 좋은 글

참고자료

기타 참고자료

댓글목록

등록된 댓글이 없습니다.