码迷,mamicode.com
首页 > 数据库 > 详细

【MySQL】存储emoji表情报错(Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...')的解决方案

时间:2019-04-24 19:05:40      阅读:2035      评论:0      收藏:0      [点我收藏+]

标签:bytes   pac   ++   mil   输出   utf8   支持   public   serve   

Emoji表情字符现在在APP已经广泛支持了。但是MySQL的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常:
 
Java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x98\x8E‘ for column ‘nick‘ at row 1
1
原因是Mysql里UTF8编码最多只能支持3个字节,而Emoji表情字符使用的UTF8编码,很多都是4个字节,有些甚至是6个字节。
 
解决的方案有两种:
 
使用utf8mb4的mysql编码来容纳这些字符。
过滤掉这些特殊的表情字符。
方法1:使用utf8mb4的mysql编码来容纳这些字符
注意:要使用utf8mb4类型,首先要保证Mysql版本要不低于 MySQL 5.5.3。
 
第一步:在mysql的安装目录下找到my.ini,作如下修改
 
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect=‘SET NAMES utf8mb4‘
 
修改后重启Mysql
 
第二步:将已经建好的表也转换成utf8mb4
 
alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;
1
将TABLE_NAME替换成你的表名。然后就OK了。
网上流传的一个版本增加了一个步骤,就是以root身份登录Mysql,修改环境变量,将
 
character_set_client,character_set_connection,character_set_database,character_set_results,character_set_server
1
都修改成utf8mb4。不过我没有做这一步,也正常,所以可能是这一步是多余的。
 
方法2:过滤掉这些特殊的字符
 
public class charUtil {
    /**
     * 替换四个字节的字符 ‘\xF0\x9F\x98\x84\xF0\x9F)的解决方案 ??
     */
    public static String removeFourChar(String content) {
        byte[] conbyte = content.getBytes();
        for (int i = 0; i < conbyte.length; i++) {
            if ((conbyte[i] & 0xF8) == 0xF0) {
                for (int j = 0; j < 4; j++) {
                    conbyte[i + j] = 0x30;// 0x30 int=48   字符=0
                }
                i += 3;
            }
        }
        content = new String(conbyte);
        return content.replaceAll("0000", "");
    }
 
    /**
     * 将emoji表情替换成*
     * @return 过滤后的字符串
     * 过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。
     */
    public static String filterEmoji(String source) {
        if (StringUtils.isNotBlank(source)) {
            return source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");
        } else {
            return source;
        }
    }
 
    public static void main(String[] arg) {
        try {
            System.err.println("测试->将emoji表情替换成*");
            String text = "This is a smiley \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 ";
            System.out.println(text);
            System.out.println(text.length());
            System.out.println(text.replaceAll("[\\ud83c\\udc00-\\ud83c\\udfff]|[\\ud83d\\udc00-\\ud83d\\udfff]|[\\u2600-\\u27ff]", "*"));
            System.out.println(filterEmoji(text));
            //输出结果
            //This is a smiley ?? face?? ?? ?? ?? ?? ?? ??
            //45
            //This is a smiley * face?? ?? ?? ?? ?? ?? ??
            //This is a smiley * face* * * * * * *
 
            System.err.println("测试->替换四个字节的字符 ‘\\xF0\\x9F\\x98\\x84\\xF0\\x9F)的解决方案 ??");
            String title = "ff的范德萨分????????Llfldakf;dsk。f????????????daslfjdsa;lfkjdsd‘j‘l‘f‘k‘d‘j‘sa‘l‘k";
            System.out.println(removeFourChar(title));
            //输出结果:ff的范德萨分Llfldakf;dsk。fdaslfjdsa;lfkjdsd‘j‘l‘f‘k‘d‘j‘sa‘l‘k
 
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

【MySQL】存储emoji表情报错(Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...')的解决方案

标签:bytes   pac   ++   mil   输出   utf8   支持   public   serve   

原文地址:https://www.cnblogs.com/bxcsx/p/10764262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!