关于mysql存储Emoji表情

关于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;
        }
    }

注:以上为整理的笔记,勿扰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值