개발노트

목록

이모티콘 저장 안 될 때, utf8mb4 : MySQL, MariaDB 저장 오류 해결하기

utf8mb4 이모지저장 mysqli_set_charset 문자셋 emoji 저장오류 mysql 인코딩
MySQL 2025.06.30 14 회 읽음
MySQL 1일 전 14



거래처에서 데이터를 저장하는 과정에서 내용이 잘린다고 연락이 와서 확인하게 되었습니다.

동일한 텍스트를 입력하여 확인하는 중에 원인을 알게 되었네요.

요즘은 chatgpt를 이용하다 보니 이모티콘을 텍스트 중간에 섞어서 제공하는 경우가 있습니다.



이모티콘이 저장 안되는 원인은?

MySQL/MariaDB 에서 기본 UTF8 이렇게 지정되어 있지만 실제로는 UTF8-Lite 버전으로 최대 3바이트까지만 저장이 가능합니다.

이모티콘의 경우 4바이트 문자라서 잘리거나 에러가 생기게 되는 게 원인 입니다.

해결 방법으로는 utf8을 utf8mb4 4byte 지원 버전으로 변경하는 방법 입니다.

그렇데 utf8을 수정하면 되는데 utf8mb4라는 이름을 사용하게 되었을까? 이것은 기존에 utf8 사용의 호환성 때문에 그대로 두고 utf8mb4 가 추가된 것이다.



UTF8 을 UTF8MB4 변경하기

아래 방법을 통해 전체 적용하는 방법과 하나만 변경하기 그리고 utf8mb4 적용이 안된 테이블만 변경하는 방법에 대해서 알려드리겠습니다.


utf8mb4 바뀌지 않은 테이블만 자동으로 ALTER 쿼리 실행하기

SELECT CONCAT(
  'ALTER TABLE `', TABLE_NAME,
  '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
) AS alter_stmt
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '데이터베이스 이름'
  AND (TABLE_COLLATION IS NULL OR TABLE_COLLATION NOT LIKE 'utf8mb4%');


utf8mb4로 변환하는 쿼리 자동 생성

SELECT CONCAT(
    'ALTER TABLE `', TABLE_NAME,
    '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'
) AS alter_stmt
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '데이터베이스 이름';

특정 DB의 테이블 리스트 얻는 쿼리

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '데이터베이스 이름';

데이터베이스, 테이블, 컬럼 모두 utf8mb4로 설정
ALTER DATABASE [테이버테이스이름] CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE [테이블이름] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

참고로 PHP 쪽에서 PDO를 사용한다면 PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" 이렇게 설정 해 줘야 합니다.
mysqli_connect 접속 방법이라면 mysqli_set_charset($connect, "utf8mb4"); 해당 부분 하나 추가하면 됩니다.

MySQL 이나 MariaDB의 경우 이모티콘이 저장이 안되거나 내용이 짤려 저장되는 오류를 수정할 수 있는 방법을 소개 해 드렸습니다.
평소에 이모티콘을 전혀 사용하지 않는데 chatgpt 사용하다 보니 이런 경우가 생기네요.


목록