Backend/Database

Mysql 이모지 저장하기

findmypiece 2022. 2. 7. 09:43
728x90

이모지 같은 문자들은 글자당 최대 4바이트의 사이즈가 필요한데 Mysql 의 utf8 문자셋의 경우 글자당 최대 3바이트까지만 지원한다. 이에 일부 ❤️ 같은 일부 이모지는 저장 가능하지만 🧜 같은 이모지는 아래와 같은 오류와 함께 저장이 되지 않는다.

SQL Error: 1366, SQLState: HY000
Incorrect string value: '\xF0\x9F\xA7\x9C' for column ...

 

모든 이모지를 사용하려면 문자셋을 utf8mb4 로 변경해줄 필요가 있다. 참고로 utf8는 utf8mb4의 서브셋이기때문에 인코딩 타입이 utf8 -> utf8mb4 변경 되더라도 기존에 저장된 문자열이 깨지지는 않는다. 

 

다만 문자 하나당 최대 바이트 수가 바뀌면서 문자열 칼럼에 인덱스가 걸려있었다면 문제가 발생할 수 있다. 아래의 계산법에 따라 인덱스가 걸린 VARCHAR(255)인 필드가 있었다면 이 필드는 utf8mb4로 변경이 불가능하고 VARCHAR(191)로 길이를 줄여줘야 인덱스를 유지한 상태로 utf8mb4로 변경이 가능하다.

 

  • VARCHAR(255)이 차지하는 최대 bytes 수
    • utf8인 경우 255 x 3 = 765 bytes (인덱스 가능)
    • utf8mb4인 경우 255 x 4 = 1020 bytes (인덱스 불가능!)
  • VARCHAR(191)
    • utf8mb4인 경우 191 x 4 = 764 bytes (인덱스 가능)

 

이에 문자셋 변경의 경우 데이터베이스의 기본 문자셋 바꾸기 보다 문자열 칼럼을 인덱스로 사용하지 않는 특정 테이블만 ALTER 문으로 변경하는 것을 추천한다.

 

 

ALTER TABLE '테이블명' CONVERT TO CHARACTER SET utf8mb4;

 

https://www.letmecompile.com/mysql-utf8-utf8mb4-migration/
728x90

'Backend > Database' 카테고리의 다른 글

[Mysql] InnoDB lock, Dead lock  (0) 2022.03.10
[Mysql] 커넥션 정보  (0) 2022.02.17
Mysql DB 용량 확인  (0) 2022.01.05
인덱스 스캔과 묵시적 형변환  (0) 2021.10.20
스키마와 유저. 그리고 데이터베이스  (0) 2021.08.19