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

news/2024/10/21 17:48:09/
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:过滤掉这些特殊的字符
import org.apache.commons.lang.StringUtils;
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();
}
}
}

转载于:https://www.cnblogs.com/bxcsx/p/10764262.html


http://www.ppmy.cn/news/235552.html

相关文章

Micropython——L298N电机驱动模块

文章目录 L298N电机驱动模块PWM调速原理 编码器电机接线直流电机接线PWM代码 L298N电机驱动模块 L298N 电机驱动模块可以直接驱动两路 3-16V 直流电机&#xff0c;并提供了 5V 输出接口&#xff08;输入最低只要 6V&#xff09;&#xff0c;可以给5V单片机电路系统供电 &#…

9x9数独算法

下面给出了源代码 sdks文件里面含有120个数独 请各位大大纠正 这个算法也可以用来做生成数独&#xff0c;然后取出几个 比如你给定数独为 000000000000000000000000000000000000000000000000000000000000000000000000000000001# 嘿嘿&#xff0c;这解可多了&#xff0c;机器…

java 字节替换_java 替换四个字节的字符 '\xF0\x9F\x98\x84\xF0\x9F)的解决方案

/** * 替换四个字节的字符 \xF0\x9F\x98\x84\xF0\x9F)的解决方案 &#x1f601; * author ChenGuiYong * data 2015年8月11日 上午10:31:50 * param content * return */ public static String removeFourChar(String content) { byte[] conbyte content.getBytes(); for (int…

【SemiDrive源码分析】【X9 Audio音频模块分析】16 - 音频模块框图及硬件原理图分析

【SemiDrive源码分析】【X9 Audio音频模块分析】16 - 音频模块框图及硬件原理图分析 一、X9HP 音频模块框图及硬件原理图分析1.1 音频接口 I2S 介绍1.2 X9 平台音频模块框图1.3 X9 平台各 Domain 用的 I2S接口 及 CLK 介绍1.3.1 `Safety OS Domain` 的 `I2S1` 接口:送数据入DS…

EndNote X9 教程入门到进阶 win mac

数据库创建 打开EndNote&#xff08;激活版下载&#xff09;&#xff0c;界面如下&#xff1a; 首先需要新建文献数据库文件&#xff0c;File- New- 选择文件夹&#xff1a; 选择保存路径后点击确定即完成数据库文件创建&#xff0c;创建后生成两个文件&#xff1a;MyEndNote L…

【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析(一)

【SemiDrive源码分析】【X9芯片启动流程】30 - AP1 Android Kernel 启动流程 start_kernel 函数详细分析&#xff08;一&#xff09; 一、Android Kernel 启动流程分析1.1 入口汇编代码 arch\arm64\kernel\head.S &#xff1a; 跳转start_kernel() 入口函数1.2 入口函数 start_…

mysql 字符串值不正确,不正确的字符串值:“ \ xF0 \ x9F \ x8E \ xB6 \ xF0 \ x9F…” MySQL...

我正在尝试在我的MYSQL表中存储一条推文。的鸣叫是&#xff1a; quiero que me escuches&#xff0c;no te burles no te rias&#xff0c;anoche tuve unsueoque te fuiste de mi vida&#x1f3b6;&#x1f3b6; tweet_text我表格中的字段编码为utf8mb4。但是&#xff0c;当我…

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析 一、freertos_safetyos目录结构分析二、DIL2 抓取编译log三、DIL2 代码流程分析3.1 start.S 入口汇编代码,初始化环境后跳转lk_main()3.2 lk_main() 创建并执行 boo…