거래처에서 데이터를 저장하는 과정에서 내용이 잘린다고 연락이 와서 확인하게 되었습니다.
동일한 텍스트를 입력하여 확인하는 중에 원인을 알게 되었네요.
요즘은 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 = '데이터베이스 이름';
ALTER DATABASE [테이버테이스이름] CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE [테이블이름] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;