MySQL 5.0과 같이 저버전을 사용하게되면, 요즘 스마트폰에 기본으로 적용된 Emoji 문자때문에 골치 아픈 경우가 많습니다.
왜?
MySQL은 기본적으로 UTF-8이 3Byte까지만 지원하기때문에 4Byte로 구성된 Emoji와 같은 문자가 저장되면 빈 값으로 저장되거나 ?? 등으로 저장됩니다.
이를 방지하기 위해서 (정확이는 utf8mb4 타입을 적용하기 전까지 임시방편으로 ..)
저장되지 않도록 애플리케이션단에서 제거할 필요가 있습니다.
PHP 기준입니다.
preg_replace("/\xF0[\x90-\xBF][\x80-\xBF]{2}|
[\xF1-\xF3][\x80-\xBF]{3}|
\xF4[\x80-\x8F][\x80-\xBF]{2}/", "", $string);
오잉 이게 뭐지? 싶겠지만,
http://docs.oracle.com/cd/E24693_01/server.11203/e10729/appunicode.htm#CACHBDGH 여기를 참고해보시면 4Byte UTF-8의 first Byte는 F0~F4로 구성되어 있습니다.
이 정보는 1~3Byte와 중복되지 않는 값으로 일종의 Key값(?)으로 생각하면 될것 같네요.
💞💞허허허💞💞 -> 허허허가 됩니다.
⛄허허 -> ⛄허허가 됩니다.
ㄴ 으잉? 이라고 생각되겠지만 이 문자는 3Byte로 구성된 UTF-8로 없어지지 않는 것이 맞고, 저버전 MySQL도 문제없이 처리가능합니다.
- http://apps.timwhitlock.info/unicode/inspect?s=%E2%9B%84
참고된 테이블 구성 그대로 정규식으로 조합하여 4Byte UTF-8 문자를 찾아내어 ""(빈값)으로 replace합니다.
참고 사이트
- 특정 문자 구성내용 보기
http://apps.timwhitlock.info/unicode/inspect?s=%F0%9F%92%9E
- UTF-8 구성표
http://www.utf8-chartable.de/unicode-utf8-table.pl
- http://stackoverflow.com/questions/16496554/can-php-detect-4-byte-encoded-utf8-chars
- getEmoji
http://getemoji.com/