Incorrect string value: '\xF0\x9F...',emoji插入数据库乱码问题解决楼主自测!

在我们开发项目中,有一个问题是一直绕不过去,那就是存储用户的信息,而在这个问题上,令大家头疼的问题就是突然发现,自己存不了含表情相关的昵称。楼主我也是深受其害,痛苦不已。接下来我把多种的解决方案跟大家分享一下。

如何解决emoji类似的问题,其实开发中就两种结果,一个过滤一个兼容。

过滤

楼主早期采用的就是过滤,凡是emoji表情的,我在代码里直接过滤掉,管你是何方妖魔鬼怪,全给你干掉。楼主是搞Java的,所以推荐大家一个操作emoji的解析工具类,操作也很方便。其他语言的童鞋可以找找自己语言的第三方库,看有没有大神已经把轮子给你们造好了。


<dependency>
    <groupId>com.vdurmontgroupId>
    <artifactId>emoji-javaartifactId>
    <version>4.0.0version>
dependency>

然后你只要在代码里添加以下一行代码即可。

//假设你的昵称存储的字段是 nickname
String nickname="含表情emoji的昵称字符串";
//移除emojis表情
nickname=EmojiParser.removeAllEmojis(content);
好处

不用自己写正则,美滋滋,一个方法就搞定,要的就是快。

坏处

也不能说全是坏处,就是还是有很多时候过滤不了。俗话说“取其精华,去其糟粕”,那也不好说谁是精华谁是糟粕了。

兼容

那过滤办法虽然能阻止大部分,但是有些奇葩的还是挡不住。那没辙,只能兼容了呗。既然会看到这篇文章的同学,那应该大家都知道是utf-8和utf8mb4的问题了,如果采用utf8mb4就可以完全的兼容表情,管他是啥表情,统统收下。

下面我说2种方式,自己大家看看哪种你能接受。

方式1:修改mysql的配置文件,将字符集修改为utf8mb4

大家不用太担心,改成utf8mb4之后会不会其他表就乱码了,不会的,如果你之前是默认utf-8的话,那么utf8mb4是utf8的超集,是可以兼容的。

修改数据库的my.ini或者my.cnf中的文件内容

[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

同时,你也要将数据字段修改成utf8mb4。你都没把存储的数据字段修改成utf8mb4,那还是没辙。

jdbcUrl连接直接写成以下形式,驱动本身会去识别你实例默认的字符集。

String url = "jdbc:mysql://HOST:PORT/DATABASE";
方式2: 不修改配置文件,目前的连接池参数中已支持这样的设置

方式1在楼主看来感觉比较暴力,因为这样是修改了整个mysql的实例的默认编码,万一以后要是变了,又得改,个人认为这种配置应该在项目级别就能被解决,所以我找了下面的这种我觉得挺合适的一种方式。

第一步: 还是一样,你也要将数据字段修改成utf8mb4。

String url = "jdbc:mysql://HOST:PORT/DATABASE";

第二步:在你用的数据库连接池包中可以设置该参数,达到平滑兼容。

Druid中的设置如下:

<property name="connectionInitSqls" value="set names utf8mb4;"/>

@注解的形式如下:

DruidDataSource dataSource = new DruidDataSource();
//设置数据源属性
dataSource.setXXX(xxx);
...
//支持emoji
List<Object> initSql = new ArrayList<>();
initSql.add("set names utf8mb4;");
datasource.setConnectionInitSqls(initSql);

用Boot的同学如果默认是用hikari的话 可以设置如下操作

hikari:
 connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci

这样,就可以完美的解决表情这种字符问题了。
Incorrect string value: '\xF0\x9F...',emoji插入数据库乱码问题解决楼主自测!_第1张图片
在这里插入图片描述

你可能感兴趣的:(数据库)