項目中因用戶輸入 Emoji 導致的 Bug 並不罕見。MySQL 常用的 utf8_general_ci 僅支援 1-3 字節字符,而 Emoji 屬於 4 字節字符,直接存儲會報錯。本文總結兩種主流解決思路。
使用 HeidiSQL 等工具將表/庫的默認字符集改為 utf8mb4,可完美存儲 Emoji。

缺點:可能需重啟數據庫;實測中偶爾失效(如連接池字符集未同步),穩定性不如方案二。
在數據入庫前用正則替換掉 4 字節字符,犧牲極小用戶體驗換取系統穩健。
錯誤嘗試:網上流傳的 replaceAll("[^\\u0000-\\uFFFF]", "") 會誤傷中英文,不可用。

正確工具方法(親測有效):
import org.apache.commons.lang3.StringUtils;
/**
* 過濾 Emoji 表情
* @param source 原字符串
* @param slipStr 替換字符(如 "" 或 "[Emoji]")
* @return 過濾後字符串
*/
public static String filterEmoji(String source, String slipStr) {
if (StringUtils.isNotBlank(source)) {
// 匹配 Unicode 代理對區範圍:\uD800-\uDBFF \uDC00-\uDFFF
return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", slipStr);
}
return source;
}
utf8mb4(數據庫、表、列、連接 URL 增加 characterEncoding=utf8mb4)。