Navicat for Mysql 显示 emoji 表情符号乱码问题 — 其它乱码情况都可参考
系统环境:
操作系统:MAC OS 10.11.6
MySQL:Server version: 5.6.21 MySQL Community Server (GPL)
Navicat for MySQL: version 9.3.1 - standard
1、问题发现
在客户端执行用户注册,用户名包括 emoji 表情符号,注册完成后,在 APP 客户端以及网页前端都可以正常显示带 emoji 符号的用户昵称,说明数据在数据库内部的存储是正常的,为什么在 Navicat for mysql 客户端里打开“用户表 tb_user”,显示的“用户昵称 nick_name”是乱码呢?
mysql> select nick_name from tb_user where id = 91;
+---------------+
| nick_name |
+---------------+
| 涛声依旧? |
+---------------+
1 rows in set (0.03 sec)
如上,查询结果的的用户昵称【涛声依旧?】,出现了一个问号,这里本应该是一个 emoji 表情符号。 该字段的字符集已经设置为 utf8mb4,可以兼容 4 个字节的 emoji 符号,所以不是数据存储的问题。初步猜测是从数据库查询获取到数据后返回给客户端的过程中出了问题?!
2、问题分析
MySQL 采用的是 C/S 架构,所以它有服务端和客户端(如:MySQL 自带的客户端、Navicat for MySQL等), 如果两端分布在不同的的主机上,那么两端通常需要通过 TCP/IP 或其它协议建立连接,然后实现通信或数据传输。跟 HTTP 协议有些类似,HTTP 发起请求时会在 Header 里附上客户端「信息体」采用的字符集。同理,MySQL 两端也需要提前沟通好通信采用的字符集,否则服务器端不知道客户端要的是什么,客户端也不知道服务端给的是什么,也就是鸡同鸭讲,乱码就会出现了。
MySQL提供了 character_set_client、character_set_connection 和 character_set_results 三个字符集变量来辅助客户端与服务端的通信。
- character_set_client:服务器会将请求(如:一条 SQL 查询语句)的字节序列当作采用 character_set_client 字符集进行编码的字节序列。假如客户端请求 mysql 语句的编码是UTF8, character_set_client 的值为 GBK,那么服务器按 GBK 编码来接收),自然返回的数据就不正确或者根本就查询数据为空。
- character_set_connection:连接数据库时的字符集。
- character_set_results:数据库给客户端返回数据时使用的字符集。
一般显示出现乱码,通常和字符集变量设置有关,我们知道字符集与数据库存储数据有关系,但客户端(Navicat)和服务端之间的交互也受到字符集影响。客户端发起请求的查询语句与返回客户端的结果都与字符集(编码)有关。
上面提过,APP客户端以及网页前端都正常显示,表字段的字符集设置也是正确的。说明数据存储是没问题的,问题很可能出在 Nacatcat 客户端与 MySQL 服务端的交互上,也就说跟上面三个字符集变量有关系。
现在我们在 Navicat 客户端打开 console 窗口查询下这三个变量的值:
show variables like "character_set%";
结果:

可以看到,这三个变量的字符集都是 utf8,,mysql 里的 utf8 字符集并不是真正的 utf8, 而是阉割版的,最长只有3个字节。utf8 字符集存储简体中文没有问题,但是存储 4 个字节的 emoji 字符就不够用了。
从上面查询结果的情况来看,返回了正确的结果(只是格式不对),客户端和服务器两端在发送请求和接受请求的过程中没有因为字符集不匹配导致出错,所以 character_set_client 的字符集变量的值没有问题。
排除了 character_set_client 的嫌疑,接着来看 character_set_results = utf8, 表示查询结果会按这个字符集进行编码。查询的字段(nick_name)包含 emoji 表情符号,在数据库内部以 ut8mb4 字符集存储,在读取后会被转成了 utf8 字符传给 Navicat 客户端,由于两个字符集的字符编码并不一致,所以 Navicat 客户端这边显示出来就成了乱码。
既然发现问题,就好办了,我们把这三个变量(其实只需要设置 character_set_results )设置为可以兼容 emoji 表情的的字符集 utf8mb4 即可。
# 等效于将三个变量同时设置为utf8mb4字符集
set names utf8mb4# 单独设置一个变量
set character_set_results=utf8mb4;

修改后再次查询,可以看到,这个 emoji 表情已经可以正常显示了。

3、问题解决
注意:上面提到的三个字符集变量是受作用域限制的,都属于同一个 Session 作用域,我们打开 Console 窗口,相当于在客户端与服务器新建了连接,这三个字符集变量的值只在当前 Session 作用域有效。当我们重新打开一个新的窗口或连接,仍然会恢复之前的字符集(UTF8)设置。
Navicat 客户端打开数据表查看数据的操作与在 Console 窗口执行查询语句是一样的道理,表格里的数据都是查询后返回的数据,所以也同跟上面三个字符集变量有直接关系。那么怎么才能让 Navicat 客户端打开数据表始终可以看到正常的 emoji 表情呢?
其实 Navicat for Mysql 客户端有个数据库的「连接属性」设置面板,在里面可以设置「客户端字符集」,这个与在 MySQL 安装目录 my.conf | my.ini 进行配置效果是一样的,可以实现让客户端和服务器每次连接都根据这里的配置预先设置好上面三个字符集变量。
4、结语
这里只是抛砖引玉,分析了 emoji 字符乱码出现的场景,其他类似的在任何客户端出现「字符乱码」的情况都可以参考这个思路去分析,也就是说从字符的「存储」和「传输/交互」两个角度去分析,总会找到问题的根源。
以上出现了一些关于「字符集」的术语,其实 MySQL 的一些莫名其妙的「乱码」都与它密切相关。 所以有必要对 MySQL 字符集有清晰透彻的理解。如果你想真正理解 MySQL 字符集,可以参考笔者另外一篇文章:
MySQL 字符集概念、原理及配置之图文详解
相关文章:
Navicat for Mysql 显示 emoji 表情符号乱码问题 — 其它乱码情况都可参考
系统环境: 操作系统:MAC OS 10.11.6 MySQL:Server version: 5.6.21 MySQL Community Server (GPL) Navicat for MySQL: version 9.3.1 - standard 1、问题发现 在客户端执行用户注册,用户名包括 emoji 表情符号,注册完…...
《数字图像处理-OpenCV/Python》连载(2)目录
《数字图像处理-OpenCV/Python》连载(2)目录 本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 第一部分 OpenCV-Python的基本操作 第1章 …...
Go学习-Day4
文章目录 Go学习-Day4函数值传递,引用传递常用的函数 异常处理数组Slice切片 Go学习-Day4 个人博客:CSDN博客 函数 值传递,引用传递 值传递直接拷贝值,一般是基本数据类型,数组,结构体也是引用传递传递…...
将el-dialog封装成函数调用
1、 使用Vue实例化方法 // MyDialog.js import Vue from vue export const openFormDialog function ({ props {}, events {} }) {const vm new Vue({data () {return {form: {}}},render () {return (<el-dialogvisible{true}{...{ props }}{...{ on: events }}onClos…...
Windows10批处理命令行设置环境变量笔记,无需重新安装python与chrome
近期,工作中经常安装、部署python生产、开发环境,比较麻烦,也没有心情去优化。突然,我的电脑崩溃了,在重新安装电脑的过程中,保留了原来的安装软件(有的没有放在系统盘中)࿰…...
统计学补充概念07-比较树
概念 在层次聚类中,聚类结果可以以树状结构表示,通常称为树状图(Dendrogram)。树状图展示了数据点如何被合并或分裂以形成聚类的层次结构。通过观察树状图,可以更直观地理解数据点之间的相似性和关系。 在比较树状图…...
设计原则 --《设计模式之美》总结篇
本文是阅读《设计模式之美》的总结和心得,跳过了书中对面试和工作用处不大或不多的知识点,总结总共分为三章,分别是面对对象编程范式、设计原则和设计模式。 设计模式是代码设计时的一些经验总结。相比于设计模式,设计原则更抽象。…...
Day16-蜗牛影城后端开发
蜗牛影城后端开发 一 多表关联查询 电影集合movie的type(类别)字段关联到电影类别movieType表的_id(主键) 二 蜗牛影城后端开发 1 数据的导入导出 2 用户模块 UserModel.js //导入mongoose,并解构出Schema(类)和model(对象) const {Schema,model} =...
axios / fetch 实现 stream 流式请求
axios 是一个支持node端和浏览器端的易用、简洁且高效的http库。本文主要介绍 axios 如何实现 stream 流式请求,注意这里需要区分 node 环境和浏览器环境。 一、node端 代码演示: const axios require(axios);axios({method: get,url: http://tiven.c…...
Pytorch学习:torchvison.transforms常用包(ToTensor、Resize、Compose和RandomCrop)
torchvision.transforms常用包 1. torchvision.transforms.ToTensor2. torchvision.transforms.Resize3. torchvision.transforms.Compose4. torchvision.transforms.Normalize5. torchvision.transforms.RandomCrop 1. torchvision.transforms.ToTensor 将PIL Image或ndarray…...
算法通关村十二关 | 字符串转换
1. 转换小写字母 LeetCode709:给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 每个字母都是有确定的ASCII的,可以根据码表操作子字符串,常见的ASCII范围是: a-z: 97-122, …...
前端进阶Html+css09----BFC模型
1.什么是BFC模型 全称是:Block formatting context(块级格式化上下文),是一个独立的布局环境,不受外界的影响。 2.FC,BFC,IFC 元素在标准流里都属于一个FC(Formatting Context)。 块级元素的布…...
重排链表(C语言)
题目: 示例: 思路: 这题我们将使用栈解决这个问题,利用栈先进后出的特点,从链表的中间位置进行入栈,寻找链表的中间位置参考:删除链表的中间节点,之后从头开始进行连接。 本题使用…...
el-table动态合并单元格
el-table使用这个方法合并单元格,:span-method“hbcell” <el-table size"small" :data"table.data" border empty-text"暂无数据" :cell-style"cellStyle" :header-cell-style"tableHeaderColor":span-meth…...
html元素
文章目录 html基本结构属性语义化为什么要语义化 示例head中属性样式一些概念块级元素与行级元素空白折叠 html编程没有css的html显示逻辑 html基本结构 html基本单元就是元素,每个元素有标记和属性,如: <a href"...">www&…...
push github
一、生成密钥 打开git bash执行下面指令,Enter下一步Enter下一步..生成ssh key 密钥; ssh-keygen -t rsa 二、 复制公共密钥到git hub 登录github,在选项setting >> SSH and GPG key >> add new ssh添加刚才的公钥地址即可 验证…...
iFluor 594 Styramide是一种荧光染料,常用于生物分子标记和成像
试剂 | 基础知识概述(部分): 中文名称:Alexa Fluor 594酪Styramide 分子量:1341.71 胺的优异替代品 100 Slides 英文名称:iFluor 594 Ex (nm):588 Em (nm):604 规格标准:1g&am…...
动态规划入门之01背包变形嗑药
P1802 5 倍经验日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 嗑药固然可耻,但是能让你快速变强 --鲁迅 手动滑稽,话归正题 动态规划之背包入门01背包模板_爱莉我老婆的博客-CSDN博客 这是01背包的模板,没看的可以去看看。 我们把…...
数据结构——栈和队列OJ题
栈和队列小提升! 前言一、用队列实现栈队列接口实现(1)栈的接口定义(2)栈的初始化(3)入栈函数的定义(4)出栈函数的定义(5)查找栈顶元素࿰…...
同态排序算法
参考文献: [Batcher68] Batcher K E. Sorting networks and their applications[C]//Proceedings of the April 30–May 2, 1968, spring joint computer conference. 1968: 307-314. [SV11] Smart, N.P., Vercauteren, F.: Fully homomorphic SIMD operations. IA…...
贝叶斯岭回归实战:用Python搞定金融数据预测(附完整代码)
贝叶斯岭回归实战:用Python搞定金融数据预测(附完整代码) 金融市场的波动性一直是投资者和分析师关注的焦点。在瞬息万变的股票市场中,能够准确预测价格走势意味着巨大的商业价值。传统的时间序列分析方法如ARIMA虽然经典…...
手把手推导NCP1380准谐振反激公式:用Mathcad复现ON官方计算书(附推导过程)
从零推导NCP1380准谐振反激公式:Mathcad实战全解析 当电源工程师第一次打开NCP1380官方计算书时,那些看似魔术般直接呈现的公式往往让人既兴奋又困惑。兴奋的是有了现成的设计工具,困惑的是这些公式背后的物理本质和数学逻辑被隐藏在技术文档…...
告别硬编码路径:手把手教你用Go cgo优雅集成第三方C库(Windows/MinGW环境)
告别硬编码路径:用Go cgo优雅集成第三方C库的工程实践 在混合编程的世界里,Go与C/C的联姻既带来了性能红利,也伴随着路径管理的噩梦。当项目需要引用多个第三方库时,硬编码的绝对路径会让构建脚本变得脆弱不堪,团队协作…...
便携式动物源性成分检测仪 肉类真假检测仪
整机采用极简一体化便携设计,无冗余复杂配件,整套系统由两大核心部分构成,兼顾设备专业性与便携实用性,开箱即可快速开展检测工作,无需额外搭建复杂检测环境,完美适配现场流动检测需求:核心检测…...
终极实战指南:在Docker容器中运行Windows系统的完整解决方案
终极实战指南:在Docker容器中运行Windows系统的完整解决方案 【免费下载链接】windows Windows inside a Docker container. 项目地址: https://gitcode.com/GitHub_Trending/wi/windows 还在为Windows虚拟机占用大量系统资源而烦恼吗?想体验在容…...
ICRS-101机器人手动控制API协议设计与嵌入式实现
1. ICRS_101_API 项目概述ICRS_101_API 是一套面向教育与科研场景的机器人手动控制接口规范,专为 ICRS-101 型教学机器人平台设计。该 API 并非独立运行的固件或中间件,而是一组定义清晰、硬件无关的通信协议与软件抽象层,其核心目标是为上位…...
从‘噬菌体’到清晰地图:我的LIO-SAM避坑实战记录(含Ubuntu版本选择建议)
从“噬菌体”到清晰地图:LIO-SAM实战避坑指南与Ubuntu版本选择建议 第一次在RViz里看到那个旋转成筒状的地图时,我盯着屏幕足足愣了三分钟——这和我预想中的高精度点云地图相差了十万八千里。更令人崩溃的是,当我把设备搬到室外测试时&#…...
告别Joplin!用MarkDownload+Obsidian打造你的网页剪藏工作流(附完整配置JSON)
从Joplin到Obsidian:用MarkDownload构建高效网页剪藏系统 每次在网上冲浪时遇到值得保存的内容,你是否也经历过这样的困境?收藏夹里堆满了再也找不到的链接,或是剪藏工具中杂乱无章的片段。作为一个长期依赖Joplin进行知识管理的用…...
2026年AI产品经理终极指南:零基础到精通,一篇文章掌握全部!AI产品经理学习路线!
成为一名优秀的AI产品经理不仅需要掌握相关的技术知识,还需要具备良好的产品思维、市场洞察力以及跨部门沟通协调能力。下面是一个详细的AI产品经理学习路线,旨在帮助有志于从事该职业的人士快速成长。 AI产品经理的学习路线 第一阶段:基础…...
Fasd终极路线图:2025年项目发展方向与社区规划完全指南
Fasd终极路线图:2025年项目发展方向与社区规划完全指南 【免费下载链接】fasd Command-line productivity booster, offers quick access to files and directories, inspired by autojump, z and v. 项目地址: https://gitcode.com/gh_mirrors/fa/fasd Fasd…...
