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

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

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

过滤

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

<!--表情过滤-->
<dependency>
    <groupId>com.vdurmont</groupId>
    <artifactId>emoji-java</artifactId>
    <version>4.0.0</version>
</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

这样,就可以完美的解决表情这种字符问题了。
在这里插入图片描述
在这里插入图片描述

MySQL中,当遇到类似于"Incorrect string value: '\xF0\x9F\x93\xBD&n...'"的错误时,通常是由于存储的字符超出了数据库默认的字符集范围所导致的。这个错误消息中的\xF0\x9F\x93\xBD是一个unicode字符的编码表示。解决这个问题的方法有以下几种: 1. 修改数据库字符集:可以通过修改数据库的默认字符集来解决这个问题。可以将数据库的字符集修改为支持存储这些特殊字符的字符集,比如utf8mb4字符集。 2. 修改表字段的字符集:如果只有某个表或某个字段需要存储这些特殊字符,可以只修改该表或该字段的字符集。可以使用ALTER TABLE语句来修改表的字符集,使用ALTER TABLE语句的MODIFY列语法来修改字段的字符集。 3. 修改连接字符集:如果修改数据库字符集或表字段字符集不起作用,可能是因为连接的字符集也需要进行修改。可以在连接数据库时,指定字符集为utf8mb4。 需要注意的是,修改字符集可能会引起一些其他影响,比如占用更多的存储空间。在修改字符集之前,建议先备份数据,并测试修改后的效果。 引用:Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\xA4\xA3\xF0\x9F...‘ 原因 。 引用:1、异常 java.sql.BatchUpdateException: Incorrect string value: '\xF0\x9F\x8D\x83\xF0\x9F...' for column 'nickname' at row 1 。 引用:本文主要介绍了关于MySQL存储表情报错:java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\xA9\x0D\x0A…’的相关解决方法,分享出供大家参考学习,下面话不多说了,来一起看看详细的介绍。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Cause: java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\xA4\xA3\xF0\x9F...‘SpringBoot](https://blog.csdn.net/qq_53679247/article/details/128225692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [解决MysqlIncorrect string value: '\xF0\x9F\x8D\x83\xF0\x9F...' for column](https://blog.csdn.net/fighterandknight/article/details/103182157)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MySQL存储表情时报错:java.sql.SQLException: Incorrect string value:‘\xF0\x9F\x92\xA9\x0D\x0A…’的...](https://download.csdn.net/download/weixin_38685876/13703258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰肥啊

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值