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

본문 바로가기
사이트 내 전체검색

Info Tech

▒ Info Tech ▒ 네트워크/보안/해킹 ▒ 하드웨어 ▒ 소프트웨어
Information Technology Group
▒ Info Tech ▒ 네트워크/보안/해킹 ▒ 하드웨어 ▒ 소프트웨어

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

페이지 정보

profile_image
작성자 최고관리자
댓글 2건 조회 10회 작성일 26-07-26 14:22

본문

게시판 필드 타입을 아무리 크게 변경해도 아이콘(이모지)을 넣었을 때 글이 뚝 잘려버리는 이유는 그누보드와 데이터베이스(DB)의 문자 저장 방식(Charset) 문제 때문입니다. 즉, 글자 수 한도를 초과한 것이 아니라 데이터를 저장하는 방식의 규격이 맞지 않아 발생한 현상입니다. 
원인을 정확히 이해하고, 게시판에서 아이콘과 긴 글을 모두 완벽하게 사용할 수 있는 해결 방법을 안내해 드리겠습니다.

1. 아이콘이 있으면 왜 글이 잘릴까? (원인)
스마트폰이나 PC에서 입력하는 아이콘은 단순한 그림이 아니라 4바이트(4bytes) 크기의 데이터로 구성된 문자(이를 이모지/Emoji라고 부릅니다)입니다. 
  • 기존 그누보드 설정 ( utf8 ): 한 글자를 최대 3바이트까지만 저장할 수 있습니다.
  • 발생하는 문제: 글을 작성하다가 4바이트짜리 이모지 문자가 등장하면, 데이터베이스는 이를 해석하지 못해 치명적인 오류로 인식합니다. 데이터의 안전을 위해 이모지 문자가 입력된 그 자리부터 뒷부분의 글 전체를 통째로 잘라내고 앞부분만 저장하게 됩니다. 

2. DB 필드 타입 변경만으로 긴 글 쓰기가 가능한가요?
네, 순수한 텍스트(한글, 영어, 숫자 등)만 작성하신다면 지난번에 설정한 DB 필드 타입( MEDIUMTEXT 등)과 이전 답변에서 수정한 php 소스 코드 변경만으로 제한 없이 엄청나게 긴 글을 쓰실 수 있습니다. 다만 4바이트 이모지 아이콘이 포함되는 순간 데이터 규격(Charset) 제한에 다시 걸리게 됩니다.

3. 게시판에 아이콘(이모지)과 긴 글을 모두 사용하려면?
데이터베이스와 그누보드가 4바이트 문자를 인식할 수 있도록 문자셋을 utf8mb4 로 업그레이드해 주어야 합니다. 아래 2가지 작업을 추가로 진행해 주세요. 
① 그누보드 설정 파일 수정 ( config.php )
그누보드 프로그램이 DB와 대화할 때 4바이트 형식으로 소통하도록 명령하는 작업입니다.
  1. FTP로 접속하여 그누보드 최상위 경로에 있는 config.php 파일을 엽니다.
  2. G5_DB_CHARSET 을 검색하여 기존 utf8 설정을 아래와 같이 utf8mb4 로 수정하고 저장합니다.
    php
                         define('G5_DB_CHARSET', 'utf8mb4');
    
                         
    코드를 사용할 때는 주의가 필요합니다.
② phpMyAdmin에서 필드의 데이터 정렬 방식 변경
wr_content(본문) 필드의 데이터 정렬 방식(Collation)을 바꿀 때, 기존에 등록되어 있던 텍스트 데이터가 유실되지 않도록 꼭 작업 전 phpMyAdmin 등에서 DB 백업을 받아두세요
문제가 발생한 해당 게시판 테이블의 문자 저장 방식을 변경해 줍니다. 
  1. phpMyAdmin에서 해당 게시판 테이블을 선택합니다.
  2. 상단의 [구조(Structure)] 탭으로 이동합니다.
  3. wr_subject (제목)와 wr_content (본문) 필드를 체크한 후 [변경(Change)] 단추를 누릅니다.
  4. 속성 중 데이터 정렬 방식(Collation)을 찾아 기존 utf8_general_ci 에서 utf8mb4_general_ci 또는 utf8mb4_unicode_ci 로 변경하고 저장합니다. 

요약하자면,
필드 타입을 바꾼 것은 글을 담을 '그릇의 크기'를 늘린 것이고, 문자셋( utf8mb4 )을 바꾸는 것은 '그릇에 담을 수 있는 물건의 종류(아이콘)'를 허용해 주는 것입니다. 위 설정을 마치시면 긴 글은 물론, 카카오톡이나 스마트폰에서 쓰는 온갖 화려한 이모지 아이콘을 마음껏 섞어 쓰셔도 글이 절대 잘리지 않고 완벽하게 등록됩니다.
write_update.php 소스코드 내 글자 자름 기능(substr) 확인
  • 체크할 파일:/bbs/write_update.php
  • 찾아야 할 코드 예시:

$wr_content = substr(trim($_POST['wr_content']), 0, 65536);

  • 해결법:만약 위와 같이substr함수로 숫자가 지정되어 글을 자르고 있다면,두 번째 숫자를 매우 크게 늘리거나 코드 자체를 주석 처리하여 자르지 않도록 수정해야 합니다
아무리 관리자 페이지에서 제한을 0으로 풀고 DBLONGTEXT로 바꾸었더라도, 이 소스코드가 살아있으면 글이 중간에 툭 잘려서 등록됩니다. 무제한 글쓰기를 원하신다면 이 부분을 반드시 수정하셔야 합니다.

안전하고 깔끔하게 수정하는 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);

    // }

}

 

코드를 사용할 때는 주의가 필요합니다.

이렇게 수정하고 나면 코드 레벨에서의 글자 수 자름 제한이모지 강제 필터링이 모두 해제되므로, 관리자 설정(0) DB(LONGTEXT, utf8mb4) 설정과 완벽하게 삼박자가 맞아떨어지게 됩니다. 

댓글목록

profile_image

최고관리자님의 댓글

최고관리자 작성일

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);
    // }
}

로 바꿉니다.

profile_image

최고관리자님의 댓글

최고관리자 작성일

그누보드의 모든 게시판 테이블과 필드를 하나씩 바꾸려면 시간이 너무 오래 걸리므로, 데이터베이스(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에 다운로드해 두셨나요? 백업이 완료되었다면 위 명령어를 적용해 보세요


사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
11
어제
8
최대
28
전체
232
Copyright © HeyWEB. All rights reserved.