IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【mysql】使用utf8mb4字符集仍然不能插入表情 -> 正文阅读

[大数据]【mysql】使用utf8mb4字符集仍然不能插入表情

场景:使用数据库存储表情,需要使用utf8mb4字符集。MySQL在5.5.3之后增加了utf8mb4字符编码。utf8mb4是utf8的超集并完全兼容utf8,能够用四个字节存储更多的字符。而utf8是utf8mb3的别名。标准的UTF-8字符集编码是可以用1~4个字节去编码21位字符,但是MySQL其实实现的utf8只是使用3个字节而已,utf8mb4才是真正意义上的utf8。


报错信息:

Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x8F\xA0' for column 'test_introduce' at row 1

问题:这是字符集不兼容的问题。

根据博主文章,字符集优先级:
字段字符集 > 表的字符集 > 库的字符集

源码借鉴于【morris131】博主。
JDBC源码:

// realJavaEncoding为url中指定characterEncoding的值
if (realJavaEncoding.equalsIgnoreCase("UTF-8") || realJavaEncoding.equalsIgnoreCase("UTF8")) {

	// 取MySQL服务端character_set_server
	boolean useutf8mb4 = CharsetMapping.UTF8MB4_INDEXES.contains(this.session.getServerDefaultCollationIndex());

	if (!this.useOldUTF8Behavior.getValue()) {
		if (dontCheckServerMatch || !this.session.characterSetNamesMatches("utf8") || (!this.session.characterSetNamesMatches("utf8mb4"))) {
			// 执行set names xxx
			execSQL(null, "SET NAMES " + (useutf8mb4 ? "utf8mb4" : "utf8"), -1, null, false, this.database, null, false);
			this.session.getServerVariables().put("character_set_client", useutf8mb4 ? "utf8mb4" : "utf8");
			this.session.getServerVariables().put("character_set_connection", useutf8mb4 ? "utf8mb4" : "utf8");
		}
	} else {
		execSQL(null, "SET NAMES latin1", -1, null, false, this.database, null, false);
		this.session.getServerVariables().put("character_set_client", "latin1");
		this.session.getServerVariables().put("character_set_connection", "latin1");
	}

	this.characterEncoding.setValue(realJavaEncoding);
}

在获取mysql的服务器参数后,解析字符集编码
character_set_server = utf8时,执行SET NAMES utf8
character_set_server = utf8mb4时,执行SET NAMES utf8mb4

问题复现:

sql:

	SET NAMES utf8;
	REPLACE INTO t_test (test_introduce) VALUES ('??🏠')

INSERT INTO t_thread_vote_cfg (vote_introduce) VALUES ('??🏠') 1366 - Incorrect string value: '\xF0\x9F\x8F\xA0' for column 'test_introduce' at row 1


解决思路

1、首先确定检查参数,查看java传入数据库是是否发生转译,确认参数。
确认参数

2、确定当前数据库字符集
确认表的字符集

3、查看字段的字符集

show full columns from test
show full columns from (表名)

在这里插入图片描述

4、查看库字符集,右击库名编辑数据库就可以看到

5、当你发现这些都没有问题的时候,就应该看看你的数据库配置文件的问题。

查看服务器字符集
show variables like ‘%character%’;

我这里是更改之后的所以是utf8mb4,如果是utf8,则在my.cnf文件中添加配置,重启服务

character_set_server = utf8mb4

在这里插入图片描述

————————————————
借鉴文章链接:https://blog.csdn.net/u022812849/article/details/125893345

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 00:59:31  更:2022-09-30 01:02:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 5:31:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码