起源,项目中出现了异常,Message:Incorrect string value: '\xF0\x9F\x87\xB5\xF0\x9F...' for column 'signature' at row 1

经查,前端输入了emoji的表情——[cano . 40 ]

因此了解到需要将数据库字符集改为 utf8mb4,下面记录了一步一步解决过程

1.了解 utf-8 utf-8mb4

utf8是“utf8mb3”的一个别名,可以支持1-3字节表示的unicode字符

utf8mb4的编码,可以支持1-4字节表示的unicode字符

2. utf-8mb4的作用

为了存储超出最大长度3字节的任何场景,最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等

3. 字符集变更风险

``  MySql在5.5.3版本之后增加了一个utf8mb4的编码,mb4就是most bytes 4的意思,用来兼容四字节的unicode。其实,utf8mb4是utf8的超集,理论上原来使用“utf8”,然后将字符集修改为“utf8mb4”,也并不会对已有的utf8编码读取产生任何问题。当然,为了节省空间,一般情况下使用"utf8"也就够了``

4. 执行变更

4.1 备份数据库

4.2 判断当前MySql是否支持utf8mb4,如不支持升级版本到v5.5.3+

select version(); #查看mysql版本
SHOW variables LIKE ‘%char%’; #查看当前字符集
SHOW create database db_name; #查看数据库字符集
SHOW create table t_name; #查看表字符集

4.3 修改database、table、column字符集 (注意utf8mb4_general_ci和utf8mb4_unicode_ci)

# Update databse 
ALTER DATABASE dbgame CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# Update table
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Update colume (一般修改表就会同步表内列字符集,不过也有遇到过列还仍然是utf8的情况)
ALTER TABLE table_name CHANGE field field VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

!! 如果上述Sql无法修改列则使用以下语句:

# [$Character_Set]为字符集名称: utf8,[$Collation_Name]为排序规则名称,即字符序: utf8mb4_unicode_ci
ALTER TABLE [$Table] MODIFY [$Column_Name] [$Field_Type] CHARACTER SET [$Character_Set] COLLATE [$Collation_Name];

4.4 修改mysql配置文件my.cnf(window为my.ini)

    如果提示不支持或不识别" Default-character-set = utf8mb4 ",则将 Default 改为小写 default 即可

# 对本地的mysql客户端的配置
[client]
Default-character-set = utf8mb4
# 对其他远程连接的mysql客户端的配置
[mysql]
Default-character-set = utf8mb4
# 本地mysql服务的配置
[mysqld]
Character-set-lient-andshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# 忽视连接时指定的字符集
skip-character-set-client-handshake = true

4.5 重启数据库,检查变量

service mysql restart

SHOW VARIABLES WHERE variable_name LIKE 'character_set_%' OR variable_name LIKE 'collation%';

:如果经过上面操作仍无法存储emoji表情,修改表中字段对应的字符集为utf8mb4。(上面已有提到字段)

#例:修改table_name表中content字段支持emoji表情存取
SELECT * FROM table_name

SHOW FULL COLUMNS FROM table_name

ALTER TABLE table_name CHANGE content content VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5. 连接字符串

其中的characterEncoding=utf8可以自动被识别为utf8mb4(兼容原来的utf8),而autoReconnection(当数据库连接异常中断时,是否自动重新连接?默认为false)强烈建议配上,忽略这个属性,可能导致缓存缘故 ,没有读取到DB最新的配置,导致一直无法试用utf8mb4字符集;

 

6. Other

提前统计好需要修改的数据库和表,以及涉及到的具体字段

提前准备好更新时的操作SQL语句,修改库时快速便捷,不易出错

如果是阿里云或腾讯云等云RDS,建议先创建一个新的实例,然后把库表结构转移过去,测试通过之后,再进行数据恢复和停服迁库操作。

参考:

Ubuntu下面MySQL的参数文件my.cnf浅析

mysql 修改字符集为utf8mb4

阿里云 - RDS MySQL字符集相关说明

阿里云 - RDS MySQL使用utf8mb4字符集存储emoji表情

MySql字符集从utf8升级到utf8mb4说明和实现方式[详细]的更多相关文章

  1. mysql字符集设置utf-8

    mysql字符集设置utf-8 mysql修改环境的默认字符集为utf-8(当然你也可以设置成别的,国际点还是utf-8好) 如果不把mysql字符集统一下,后面还是有点麻烦的 首先得在服务里关掉my ...

  2. Linux 中设置 MySQL 字符集为 UTF-8

    (1)查看 MySQL 字符集 登录 mysql:mysql -u root -p 查询 mysql 字符集:mysql> show variables like 'chara%'; 说明:将 ...

  3. MySQL数据库字符集由utf8修改为utf8mb4一例

    对于mysql 5.5 而言,如果不设定字符集,mysql默认的字符集是 latin1 拉丁文字符集: 为了统一管理和应用开发的方便,一般都会统一将操作系统,客户端,数据库各方面的字符集都设置为 ut ...

  4. Mysql字符集之utf8和utf8mb4的使用问题

    Mysql之utf8和utf8mb4的区别 最近在项目中使用Mysql数据库保存emoji表情 

  5. mysql--Ubuntu下设置MySQL字符集为utf8

    1.mysql配置文件地址/etc/mysql/my.cnf 2.在[mysqld]在下方添加以下代码[mysqld]init_connect='SET collation_connection = ...

  6. MySQL字符集转换引发插入乱码问题

    根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...

  7. MySQL 如何修改字符集 utf8 改为 utf8mb4

    在实行sql server 向 mysql 迁移数据时,报错: Incorrect string value: '\xF0\x9F\x98\x8A' 原因是mysql 采用的是 utf8 的字符集,而 ...

  8. MySQL真正的UTF-8字符集utf8mb4

    MySQL有个utf-8的坑 MySQL 的 utf8 实际上不是真正的 UTF-8.utf8 只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节. MySQL 一直没有修复这个 ...

  9. mysql字符集 utf8 和utf8mb4 的区别

    一.导读我们新建mysql数据库的时候,需要指定数据库的字符集,一般我们都是选择utf8这个字符集,但是还会又一个utf8mb4这个字符集,好像和utf8有联系,今天就来解析一下这两者的区别. 二.起 ...

  10. mysql字符集utf8和utf8mb4区别

    1.起因 公司游戏项目上线第一天,出现单个区服异常宕机的问题,根据日志排查下来,连接数据的时候报错,后面排查是因为有玩家插入Emoji 等表情导致无法存储如数据库,数据库字符集编码为utf8,后续改成 ...

随机推荐

  1. Hbase shell学习

    通过Shell工具可以对云数据库HBase进行数据管理,包括建表.插入数据.删除数据和删除表等操作,本文介绍Shell的基本使用命令. 访问配置 如果使用的是云数据库HBase标准版,基本环境的配置操 ...

  2. Tomcat 连接池介绍

    Tomcat 连接池是从 Tomcat 7 开始重新编写的高并发连接池,用以取代以前 Tomcat 中使用的 DBCP 1 连接池,它可以配置在 Tomcat 中使用,也可以单独使用.本文主要介绍 T ...

  3. 利用bash脚本函数执行创建用户和组,并设置sudo权限等

    示例:利用bash脚本函数执行创建用户和组,并设置sudo权限等: Linux服务器设置历史命令记录,及命令执行的时间: sudo echo 'HISTTIMEFORMAT="%F %T w ...

  4. 『Python底层原理』--CPython 虚拟机

    在 Python 编程的世界里,我们每天都在使用 python 命令运行程序,但你是否曾好奇这背后究竟发生了什么? 本文将初步探究 CPython(Python 中最流行的实现)的一些内部机制,为了更 ...

  5. 天翼云边缘安全加速平台亮相2023亚太内容分发大会暨CDN峰会

    6月29日,第十二届亚太内容分发大会暨CDN峰会在北京召开.大会聚集了行业领/袖.专家和学者,深度探讨CDN的技术发展.应用与未来发展趋势,会上还公布了2023边缘加速创新企业榜单,中国电信天翼云成功 ...

  6. 《Vue2 框架入门第一课:基础概念与环境搭建》

    前端宇宙的新钥匙 --Vue2 在前端开发的广袤宇宙中,Vue2 框架宛如一把闪耀的钥匙,为开发者们开启了一扇通往高效.灵活构建用户界面的大门.随着互联网技术的飞速发展,前端开发的复杂性与日俱增,对开 ...

  7. Typora+PicGo+Gitee图床

    Typora+PicGo+Gitee图床 介绍 Typora:一个用于写文章的Markdown 编辑器,Typora 没有采用源代码和预览双栏显示的方式,而是采用所见即所得的编辑方式,实现了即时预览的 ...

  8. 使用Reids实现简单消息队列

    队列操作 简单队列 利用List数据结构可以实现简单的队列,在于使用List提供插入和移除api来完成简单队列操作: 准备数据 获取数据 后入先出 使用redis提供的apiLPOP可以从队列左边获取 ...

  9. [BZOJ2194] 快速傅立叶之二 题解

    看名字,然后准备转化为多项式乘法. \[c_k=\sum_{i=0}^{n-k-1}a_{i+k}b_i \] 将 \(a\) 反转,得: \[c_k=\sum_{i=0}^{n-k-1}a_{n-i ...

  10. led色块是什么,bin指值是什么

    色块其实就是色温的区域范围. LED的色温按标准是分段的, 既然是分段,就有一个最大值和最小值,在色坐标系中是一个,X和Y的坐标对应的也就有一个最大值和最小值,这样一个色温段就是以小块的区域,即所谓的 ...