关于mysql存储Emoji表情
最近做的项目里面mysql储存的时候出现这样的错误:
SQLSTATE[HY000]: General error: 1366 Incorrect string value: ‘\xF0\x9F\xA7\x80\xE8\xB6…’ for column ‘title’ at row 1
经检查原因:
UTF-8编码有可能是两个、三个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。
解决办法:
第一、将Mysql的字符集从utf8转换成utf8mb4,并且兼容utf8,字符集改成utf8mb4 不影响线上数据。mysql版本5.5以上。
1. 修改my.ini [mysqld] character-set-server=utf8mb4
2. 在后台配置mysql连接参数中,不要加characterEncoding参数。 不加这个参数时,默认值就时autodetect。
3. 将已经建好的表也转换成utf8mb4
命令:ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; (将TABLE_NAME替换成你的表名)
4. 将需要使用emoji的字段设置类型为:
命令:ALTER TABLE `TABLE_NAME`MODIFY COLUMN `COLUMN_NAME` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
第二、将Emoji表亲替换掉。
PHP代码 (亲测有效)
/**
* 替换掉emoji表情
* @param $text
* @param string $replaceTo
* @return mixed|string
*/
public static function filterEmoji($text, $replaceTo = '?')
{
$clean_text = "";
$regexEmoticons = '/[\x{10000}-\x{10FFFF}]/u';
$clean_text = preg_replace($regexEmoticons, $replaceTo, $text);
$clean_text = preg_replace_callback('/./u', function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
}, $clean_text);
return $clean_text;
}
java代码
/**
* emoji表情替换
*
* @param source 原字符串
* @param slipStr emoji表情替换成的字符串
* @return 过滤后的字符串
*/
public static String filterEmoji(String source,String slipStr) {
if(StringUtils.isNotBlank(source)){
return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", slipStr);
}else{
return source;
}
}