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...')的解决方案的更多相关文章

  1. mysql存储emoji表情报错处理,qq互联mysql存储昵称中带表情的数据时报错。

    前言 做qq互联登录时发现一个问题,如果qq昵称中有表情时存入mysql数据库会报错. java.sql.SQLException: Incorrect string value: "ð&q ...

  2. mysql存储emoji表情报错的处理方法【更改编码为utf8mb4】

    utf-8编码可能2个字节.3个字节.4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符.如果直接往采用utf-8编码的数据库中插入表情数据,Java程 ...

  3. mySql存储emoji表情报错(mysql incorrect string value)

    问题分析 普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题 ...

  4. MySQL插入emoji表情报错 SQLException: Incorrect string value 的两种解决方案

    摘抄自:https://blog.csdn.net/dmw412724/article/details/81119325 原因:mysql的UTF-8只支持三个字节的存储,而一般字符是三个字节,但是e ...

  5. MySql数据库存储emoji表情报错解决办法

    异常:java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x94' for column 'name' at row 1 解决: ...

  6. mysql 插入中文字段报错 "Incorrect string value: '\\xE6\\xB5\\x8B\\xE8\\xAF\\x95...' for column 'title' at row 1"

    1. 查看一个 database 或一个 table 的编码show create database mytestdb;show create table testapp_article; mysql ...

  7. 通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 ‘incorrect string value: '\xF0...

    原文:[原创]通俗易懂地解决中文乱码问题(2) --- 分析解决Mysql插入移动端表情符报错 'incorrect string value: '\xF0... 这篇blog重点在解决问题,如果你对 ...

  8. java保存繁体字到数据库时就报错Incorrect string value: '\xF0\xA6\x8D\x8B\xE5\xA4...' for column 'name' at row 1

    问题分析 普通的字符串或者表情都是占位3个字节,所以utf8足够用了,但是移动端的表情符号占位是4个字节,普通的utf8就不够用了,为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题 ...

  9. mysql 保存emoji时报,数据库报错:Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column 'review' at row 1

    错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实 ...

随机推荐

  1. 面试简单整理之rabbitmq

    135.rabbitmq 的使用场景有哪些? 单反单收,单发多收,发布订阅,按路由发送,按主题发送 136.rabbitmq 有哪些重要的角色? Server,Consumer,Producer 13 ...

  2. linux RCU机制

    参考资料: https://www.cnblogs.com/qcloud1001/p/7755331.html https://www.cnblogs.com/chaozhu/p/6265740.ht ...

  3. vue与js混用

    Vue 的官方是不建议直接操作 DOM 的,Vue 的用途在于视图和数据的绑定.如果通过JQuery 直接操作 DOM 的话,势必会造成视图数据和模型数据的不匹配,这样 Vue 就失去它存在的意义了. ...

  4. 从零开始学java(二)类与对象

    面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为. 类是对象的抽象,对象是类的具体实例. 1.构造一个类,让其拥有属性和方法 ...

  5. VMware Workstation 虚拟机使用无线wifi上网配置

    VMware Workstation 虚拟机使用无线wifi上网配置 参考文档: 转载/VMware Workstation环境下的Linux网络设置/适用于无线网络 VMware Workstati ...

  6. 2019.03.09 codeforces620E. New Year Tree(线段树+状态压缩)

    传送门 题意:给一棵带颜色的树,可以给子树染色或者问子树里有几种不同的颜色,颜色值不超过606060. 思路:颜色值很小,因此状压一个区间里的颜色用线段树取并集即可. 代码: #include< ...

  7. spring boot + vue + element-ui全栈开发入门

    今天想弄弄element-ui  然后就在网上找了个例子 感觉还是可以用的  第一步是完成了  果断 拿过来  放到我这里这  下面直接是连接  点进去 就可以用啊 本想着不用vue   直接导入连接 ...

  8. Maven学习3(中央仓库)

    Maven项目在运行的时候,会首先找本地仓库是否有需要的jar,如果没有则去调用远程仓库. 解读Maven在仓库中的存储路径: 1.基于groupId准备路径,将句点分隔符转成路径分隔符,就是将  & ...

  9. 【慕课网实战】七、以慕课网日志分析为例 进入大数据 Spark SQL 的世界

    用户:     方便快速从不同的数据源(json.parquet.rdbms),经过混合处理(json join parquet),     再将处理结果以特定的格式(json.parquet)写回到 ...

  10. 配置wildfly10为linux的服务,并开机启动

    1.在opt路径下 下载 wildfly ,并解压下载下的压缩包 cd /opt sudo wget -c http://download.jboss.org/wildfly/10.0.0.Final ...