为啥我的Mysql不能存储表情呢!!!!

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 为啥我的Mysql不能存储表情呢!!!!

正文


在记录解决过程之前,我们先了解一下我们的问题:

刚开始,我们没有插入任何表情的时候,我们的所有的操作是正常的,但是,我们加入一个表情,比如:😺,我们的程序就会出现问题了,抛出的异常如下。


va.sql.BatchUpdateException: Incorrect string value: '\xF0\x9D\x94\xB9+)...' for column 'title' at row 1


那我们如何进行解决呢?接下来看一看我们的解决的步骤:


1.首先,将我们数据库字段、表、数据库、mysql的编码需要设置成utf8mb4。1)修改字段字符集


ALTER TABLE table_name CHANGE column_name VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


2)设置表的字符集


ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_un


3)设置数据库的字符集


ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4


4)修改数据库应用字符集

找到linux下的mysql位置
$ whereis mysql          找到位置
$  vi my.cnf  【这里有my.ini,如果只有my-default.ini,则复制一份并命名为my.ini】
 [增加或修改]
[client]
# 客户端来源数据的默认字符集
default-character-set = utf8mb4
[mysqld]
# 服务端默认字符集
character-set-server=utf8mb4
# 连接层默认字符集
collation-server=utf8mb4_unicode_ci
[mysql]
# 数据库默认字符集
default-character-set = utf8mb4
$ service mysqld restart 重启服务即可


2、设置编码

在命令行中输入,但是这个只在当前会话起作用


set character_set_database=utf8;
set character_set_server=utf8;


3、修改连接池属性(设置会话字符集)


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

或者在数据库连接池的位置设置:

List<String> list=new ArrayList<>(1);
list.add("set names utf8mb4");
druidDataSource.setConnectionInitSqls(list);


注: set names utf8mb4; 命令会将 character_set_client、character_set_connection、character_set_results 3个会话字符集相关变量均设置为 utf8mb4,以保证写入或者读出的数据使用 utf8mb4 字符集进行解释。并且设置我们的链接属性:


jdbc.url=jdbc:mysql://localhost:3306/database?useUnicode=true&charact

特别说明其中的jdbc.url配置:如果你已经升级好了mysql-connector,其中的characterEncoding=utf8可以被自动被识别为utf8mb4(当然也兼容原来的utf8),而autoReconnect配置我强烈建议配上,我之前就是忽略了这个属性,导致因为缓存缘故,没有读取到DB最新配置,导致一直无法使用utf8mb4字符集,多么痛的领悟!


在最后,我们看一下效果:1.png


utf8与utf8mb4说明:

UTF- 8:Unicode Transformation Format-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。UTF8mb4:MySQL在5.5.3之后增加了utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
存储 SQL NoSQL
mysql存储过程和存储函数
mysql存储过程和存储函数
|
8天前
|
存储 JSON 关系型数据库
轻松入门MySQL:MySQL字段类型精解,优化存储结构,助力系统高效运行(2)
轻松入门MySQL:MySQL字段类型精解,优化存储结构,助力系统高效运行(2)
|
8天前
|
SQL 存储 关系型数据库
轻松入门MySQL:简明教程解析数据存储与管理(1)
轻松入门MySQL:简明教程解析数据存储与管理(1)
|
8天前
|
存储 缓存 关系型数据库
MySQL的varchar水真的太深了——InnoDB记录存储结构
varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实际可用空间的因素有哪些?本篇围绕innodb默认行格式dynamic来说说原理。
853 6
MySQL的varchar水真的太深了——InnoDB记录存储结构
|
8天前
|
存储 缓存 关系型数据库
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
阿里云RDS率先推出新型存储类型通用云盘,提供低延迟、低成本、高持久性的用户体验。
鱼和熊掌如何兼得?一文解析RDS数据库存储架构升级
|
8天前
|
存储 关系型数据库 MySQL
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
59 0
|
21小时前
|
存储 SQL 关系型数据库
【MySQL进阶之路 | 基础篇】存储函数
【MySQL进阶之路 | 基础篇】存储函数
|
8天前
|
存储 关系型数据库 MySQL
Mysql 存储大数据量问题
Mysql 存储大数据量问题
104 1
|
8天前
|
存储 关系型数据库 MySQL
MySQL是怎样存储数据的?
MySQL是怎样存储数据的?
|
8天前
|
存储 Kubernetes 关系型数据库
使用Helm管理创建MYSQL并使用外置存储
使用Helm管理创建MYSQL并使用外置存储
47 0