PHP 게시판 필드 타입을 아무리 크게 변경해도 아이콘(이모지)을 넣었을 때 글이 뚝 잘려버리는 이유는
페이지 정보

본문
- 기존 그누보드 설정 (
utf8): 한 글자를 최대 3바이트까지만 저장할 수 있습니다. - 발생하는 문제: 글을 작성하다가 4바이트짜리 이모지 문자가 등장하면, 데이터베이스는 이를 해석하지 못해 치명적인 오류로 인식합니다. 데이터의 안전을 위해 이모지 문자가 입력된 그 자리부터 뒷부분의 글 전체를 통째로 잘라내고 앞부분만 저장하게 됩니다.
MEDIUMTEXT
등)과 이전 답변에서 수정한 php 소스 코드 변경만으로 제한 없이 엄청나게 긴 글을 쓰실 수 있습니다. 다만 4바이트 이모지 아이콘이 포함되는 순간 데이터 규격(Charset) 제한에 다시 걸리게 됩니다.utf8mb4
로 업그레이드해 주어야 합니다. 아래 2가지 작업을 추가로 진행해 주세요. config.php
)- FTP로 접속하여 그누보드 최상위 경로에 있는
config.php파일을 엽니다. -
G5_DB_CHARSET을 검색하여 기존utf8설정을 아래와 같이utf8mb4로 수정하고 저장합니다.phpdefine('G5_DB_CHARSET', 'utf8mb4');코드를 사용할 때는 주의가 필요합니다.
- phpMyAdmin에서 해당 게시판 테이블을 선택합니다.
- 상단의 [구조(Structure)] 탭으로 이동합니다.
-
wr_subject(제목)와wr_content(본문) 필드를 체크한 후 [변경(Change)] 단추를 누릅니다. - 속성 중 데이터 정렬 방식(Collation)을 찾아 기존
utf8_general_ci에서utf8mb4_general_ci또는utf8mb4_unicode_ci로 변경하고 저장합니다.
필드 타입을 바꾼 것은 글을 담을 '그릇의 크기'를 늘린 것이고, 문자셋(
utf8mb4
)을 바꾸는 것은 '그릇에 담을 수 있는 물건의 종류(아이콘)'를 허용해 주는 것입니다. 위 설정을 마치시면 긴 글은 물론, 카카오톡이나 스마트폰에서 쓰는 온갖 화려한 이모지 아이콘을 마음껏 섞어 쓰셔도 글이 절대 잘리지 않고 완벽하게 등록됩니다.- 체크할 파일:/bbs/write_update.php
- 찾아야 할 코드 예시:
$wr_content = substr(trim($_POST['wr_content']), 0, 65536);
- 해결법:만약 위와 같이substr함수로 숫자가 지정되어 글을 자르고 있다면,두 번째 숫자를 매우 크게 늘리거나 코드 자체를 주석 처리하여 자르지 않도록 수정해야 합니다.
안전하고 깔끔하게 수정하는 2가지 방법을 안내해 드립니다.
방법 1: 글자 수 자름(제한) 기능 완전히 제거하기 (추천)
substr 함수를 아예 작동하지 않게 만들어 사용자가 입력한 본문 전체를 그대로 DB에 넘겨주는 방식입니다. substr( 부분을 지우고 괄호 매칭을 정리해 주시면 됩니다.
[수정 후 코드]
php
$wr_content = '';
if (isset($_POST['wr_content'])) {
// substr을 제거하여 글자 수 제한 없이 전체 내용을 가져옵니다.
$wr_content = trim($_POST['wr_content']);
$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
if (function_exists('normalize_utf8_string')) {
$wr_content = normalize_utf8_string($wr_content);
}
}
코드를 사용할 때는 주의가 필요합니다.
방법 2: 제한 숫자를 어마어마하게 크게 늘리기
코드를 크게 건드리지 않고 숫자만 바꿔서 사실상 무제한처럼 작동하게 만드는 방식입니다. 기존 65536을 아주 큰 숫자로 변경합니다.
[수정 후 코드]
php
$wr_content = '';
if (isset($_POST['wr_content'])) {
// 제한 용량을 약 1,000만 바이트(영문 1,000만자) 이상으로 대폭 늘립니다.
$wr_content = substr(trim($_POST['wr_content']), 0, 10485760);
$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
if (function_exists('normalize_utf8_string')) {
$wr_content = normalize_utf8_string($wr_content);
}
}
코드를 사용할 때는 주의가 필요합니다.
⚠️주의 및 팁 (이모지 관련)
수정하신 코드 아래쪽을 보면 normalize_utf8_string 이라는 함수가 작동하고 있습니다. 이 함수는 간혹 특수문자나 특정 유니코드(이모지 등)를 필터링하거나 변형하는 경우가 있습니다.
만약 DB 인코딩을 utf8mb4_general_ci로 정상 변경했는데도 이모지를 넣었을 때 글이 깨지거나 잘린다면, 이 함수 내부에서 이모지를 깨뜨리고 있을 확률이 높습니다. 그때는 이 함수가 거쳐 가지 않도록 해당 if문 3줄을 주석 처리(//)해 보시는 것을 권장합니다.
normalize_utf8_string 함수는 예전 그누보드 버전(주로 5.4 미만 버전)에서 3바이트 기반인 utf8 인코딩을 사용할 때, 4바이트짜리 이모지가 들어오면 에러가 나는 것을 막기 위해 이모지를 강제로 필터링하거나 지워버리는 역할을 하곤 했습니다.
이제 DB 인코딩을 이모지 저장이 가능한 utf8mb4로 바꾸실 예정이기 때문에, 이 함수가 본문 데이터를 건드리지 않도록 차단하는 것이 이모지를 온전하게 등록하는 데 훨씬 안전합니다.
주석 처리 수정 예시
아래와 같이 코드 앞에 사선 두 개(//)를 붙여서 연한 색(또는 녹색)으로 비활성화해 주시면 됩니다.
php
$wr_content = '';
if (isset($_POST['wr_content'])) {
$wr_content = trim($_POST['wr_content']); // 앞서 수정한 부분
$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
// 이모지 필터링을 막기 위해 아래 3줄을 주석 처리합니다.
// if (function_exists('normalize_utf8_string')) {
// $wr_content = normalize_utf8_string($wr_content);
// }
}
코드를 사용할 때는 주의가 필요합니다.
- 이전글그누보드7 admin/boards/settings 404 페이지를 찾을 수 없습니다 26.07.26
- 다음글phpmyadmin gui 게시판 필드 타입 변경이 안될 때 26.07.26
댓글목록

최고관리자님의 댓글
최고관리자 작성일
1. 가장 추천: utf8mb4_general_ci 또는 utf8mb4_unicode_ci그누보드 커뮤니티와 수많은 국내 웹 호스팅사에서 오랜 기간 이모지 연동용으로 검증된 표준 설정입니다.
utf8mb4_general_ci (속도 및 전통적인 방식 추천):정렬 속도가 약간 더 빠르며, 그누보드 유저들이 이모지 문제를 해결할 때 가장 많이 바꾸는 기본값입니다.
utf8mb4_unicode_ci (다국어 정렬 정확도 추천):세계 표준 유니코드 규칙에 맞춰 문자 간 비교와 정렬을 수행합니다. 한글/영어 외에 일어, 중국어 등 다국어 정렬이 더 정교하게 작동합니다.
💡 요약: 둘 중 무엇을 선택하셔도 이모지는 완벽하게 잘 등록되며 글이 잘리지 않습니다.
보통은 호환성이 가장 무난한 utf8mb4_general_ci를 많이 선택합니다.
▣ write_update.php 소스코드 내 아래부분
$wr_content = '';
if (isset($_POST['wr_content'])) {
$wr_content = substr(trim($_POST['wr_content']),0,65536);
$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
if (function_exists('normalize_utf8_string')) {
$wr_content = normalize_utf8_string($wr_content);
}
}
를
$wr_content = '';
if (isset($_POST['wr_content'])) {
$wr_content = trim($_POST['wr_content']); // 앞서 수정한 부분
$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
// 이모지 필터링을 막기 위해 아래 3줄을 주석 처리합니다.
// if (function_exists('normalize_utf8_string')) {
// $wr_content = normalize_utf8_string($wr_content);
// }
}
로 바꿉니다.

최고관리자님의 댓글
최고관리자 작성일
그누보드의 모든 게시판 테이블과 필드를 하나씩 바꾸려면 시간이 너무 오래 걸리므로, 데이터베이스(DB) 전체의 기본값을 바꾸고 기존 테이블들을 일괄 변경하는 쿼리(명령어)를 실행하시는 것이 가장 빠르고 정확합니다.
phpMyAdmin 등 관리 도구의 [SQL] 탭에 가셔서 아래 명령어를 상황에 맞게 실행해 주세요.
(주의: 그누보드 기본 테이블 접두사인 g5_를 기준으로 작성되었습니다. 만약 다른 접두사(예: gn_, g6_ 등)를 쓰신다면 테이블명을 본인의 환경에 맞게 수정하셔야 합니다.)
________________________________________
1단계: DB 전체의 기본 인코딩 설정 변경
앞으로 새로 만들어질 게시판 테이블들이 자동으로 utf8mb4 설정을 가질 수 있도록 DB 자체의 기본 콜레이션을 변경합니다.
sql
ALTER DATABASE `당신의_DB_이름` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
코드를 사용할 때는 주의가 필요합니다.
(※ 당신의_DB_이름 부분에 실제 사용 중인 데이터베이스 이름을 적어주세요.)
________________________________________
2단계: 그누보드 핵심 공통 테이블 변경
게시판의 글과 댓글이 실제로 저장되는 테이블(g5_write_...)들의 '원형'과 전체 통합 검색 등을 담당하는 핵심 테이블들을 한 번에 변경합니다.
sql
-- 게시판 마스터 설정 테이블 변경
ALTER TABLE g5_board CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 전체 게시글 통합 검색/관리 테이블 변경
ALTER TABLE g5_board_new CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
코드를 사용할 때는 주의가 필요합니다.
________________________________________
3단계: 개별 게시판 테이블 일괄 변경 (가장 중요)
그누보드는 게시판이 생성될 때마다 g5_write_자유게시판, g5_write_공지사항 형태로 테이블이 각각 분리되어 만들어집니다. 따라서 현재 운영 중인 게시판 테이블들을 모두 변경해 주어야 합니다.
아래 명령어를 복사하셔서 운영 중인 게시판 아이디(테이블명)에 맞게 줄을 늘려 한 번에 실행하시면 됩니다. 이 명령어를 실행하면 해당 테이블 내부의 제목(wr_subject), 본문/댓글(wr_content)을 포함한 모든 텍스트 필드가 자동으로 한번에 utf8mb4_general_ci로 변환됩니다.
sql
-- g5_write_ 뒤에 실제 게시판 아이디를 넣어서 생성된 만큼 아래처럼 적어줍니다.
ALTER TABLE g5_write_notice CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE g5_write_free CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE g5_write_gallery CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE g5_write_qa CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
코드를 사용할 때는 주의가 필요합니다.
(예시로 적어둔 notice, free 등은 본인의 게시판 아이디로 교체하셔야 합니다.)
________________________________________
💡 꿀팁: 게시판이 너무 많아서 명령어 쓰기 귀찮을 때
만약 생성된 게시판이 수십 개가 넘어 일일이 타이핑하기 힘들다면, SQL 탭에 아래 명령어를 복사해서 실행해 보세요. 변경해야 할 ALTER TABLE ... 명령어 전체를 자동으로 생성해 줍니다.
sql
SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') AS sql_statements
FROM information_schema.tables
WHERE table_schema = '당신의_DB_이름' AND table_name LIKE 'g5_write_%';
코드를 사용할 때는 주의가 필요합니다.
이 쿼리를 실행하면 화면에 결과물로 수십 줄의 ALTER TABLE ... 문장이 쭉 출력됩니다. 그 결과물들을 마우스로 전체 복사한 뒤, 다시 SQL 탭에 붙여넣고 [실행]을 누르시면 몇 초 만에 모든 게시판의 변환이 끝납니다.
작업 전 만약의 사태를 대비해 [내보내기(Export)] 탭에서 DB 백업 파일(.sql)을 PC에 다운로드해 두셨나요? 백업이 완료되었다면 위 명령어를 적용해 보세요
