当前位置: 首页 > news >正文

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_clientcharacter_set_connectioncharacter_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

近期&#xff0c;工作中经常安装、部署python生产、开发环境&#xff0c;比较麻烦&#xff0c;也没有心情去优化。突然&#xff0c;我的电脑崩溃了&#xff0c;在重新安装电脑的过程中&#xff0c;保留了原来的安装软件&#xff08;有的没有放在系统盘中&#xff09;&#xff0…...

统计学补充概念07-比较树

概念 在层次聚类中&#xff0c;聚类结果可以以树状结构表示&#xff0c;通常称为树状图&#xff08;Dendrogram&#xff09;。树状图展示了数据点如何被合并或分裂以形成聚类的层次结构。通过观察树状图&#xff0c;可以更直观地理解数据点之间的相似性和关系。 在比较树状图…...

设计原则 --《设计模式之美》总结篇

本文是阅读《设计模式之美》的总结和心得&#xff0c;跳过了书中对面试和工作用处不大或不多的知识点&#xff0c;总结总共分为三章&#xff0c;分别是面对对象编程范式、设计原则和设计模式。 设计模式是代码设计时的一些经验总结。相比于设计模式&#xff0c;设计原则更抽象。…...

Day16-蜗牛影城后端开发

蜗牛影城后端开发 一 多表关联查询 电影集合movie的type(类别)字段关联到电影类别movieType表的_id(主键) 二 蜗牛影城后端开发 1 数据的导入导出 2 用户模块 UserModel.js //导入mongoose,并解构出Schema(类)和model(对象) const {Schema,model} =...

axios / fetch 实现 stream 流式请求

axios 是一个支持node端和浏览器端的易用、简洁且高效的http库。本文主要介绍 axios 如何实现 stream 流式请求&#xff0c;注意这里需要区分 node 环境和浏览器环境。 一、node端 代码演示&#xff1a; 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&#xff1a;给你一个字符串s&#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。 每个字母都是有确定的ASCII的&#xff0c;可以根据码表操作子字符串&#xff0c;常见的ASCII范围是&#xff1a; a-z: 97-122, …...

前端进阶Html+css09----BFC模型

1.什么是BFC模型 全称是&#xff1a;Block formatting context&#xff08;块级格式化上下文&#xff09;&#xff0c;是一个独立的布局环境&#xff0c;不受外界的影响。 2.FC,BFC,IFC 元素在标准流里都属于一个FC&#xff08;Formatting Context&#xff09;。 块级元素的布…...

重排链表(C语言)

题目&#xff1a; 示例&#xff1a; 思路&#xff1a; 这题我们将使用栈解决这个问题&#xff0c;利用栈先进后出的特点&#xff0c;从链表的中间位置进行入栈&#xff0c;寻找链表的中间位置参考&#xff1a;删除链表的中间节点&#xff0c;之后从头开始进行连接。 本题使用…...

el-table动态合并单元格

el-table使用这个方法合并单元格&#xff0c;: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基本单元就是元素&#xff0c;每个元素有标记和属性&#xff0c;如&#xff1a; <a href"...">www&…...

push github

一、生成密钥 打开git bash执行下面指令&#xff0c;Enter下一步Enter下一步..生成ssh key 密钥&#xff1b; ssh-keygen -t rsa 二、 复制公共密钥到git hub 登录github&#xff0c;在选项setting >> SSH and GPG key >> add new ssh添加刚才的公钥地址即可 验证…...

iFluor 594 Styramide是一种荧光染料,常用于生物分子标记和成像

试剂 | 基础知识概述&#xff08;部分&#xff09;: 中文名称&#xff1a;Alexa Fluor 594酪Styramide 分子量&#xff1a;1341.71 胺的优异替代品 100 Slides 英文名称&#xff1a;iFluor 594 Ex (nm)&#xff1a;588 Em (nm)&#xff1a;604 规格标准&#xff1a;1g&am…...

动态规划入门之01背包变形嗑药

P1802 5 倍经验日 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 嗑药固然可耻&#xff0c;但是能让你快速变强 --鲁迅 手动滑稽&#xff0c;话归正题 动态规划之背包入门01背包模板_爱莉我老婆的博客-CSDN博客 这是01背包的模板&#xff0c;没看的可以去看看。 我们把…...

数据结构——栈和队列OJ题

栈和队列小提升&#xff01; 前言一、用队列实现栈队列接口实现&#xff08;1&#xff09;栈的接口定义&#xff08;2&#xff09;栈的初始化&#xff08;3&#xff09;入栈函数的定义&#xff08;4&#xff09;出栈函数的定义&#xff08;5&#xff09;查找栈顶元素&#xff0…...

同态排序算法

参考文献&#xff1a; [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…...

“深入探索JVM内部机制:解析Java虚拟机的工作原理“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解析Java虚拟机的工作原理 摘要&#xff1a;本文将介绍Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括类加载、内存管理、垃圾回收和字节码执行等方面。通过深入理解JVM的内部机制&#xff0c;开发人员可以…...

为应用程序接入阿里云CDN优化网站访问速度

文章目录 1.KodCloud云盘系统接入CDN之前的效果2.配置KodCloud云盘接入CDN加速器2.1.添加CDN域名2.2.配置域名信息2.3.CDN推荐配置设置2.4.CDN加速器配置完成 3.配置云解析DNS增加CDN域名的解析4.为CDN加速器配置HTTPS5.验证网站是否接入CDN6.访问应用程序观察请求速度7.观察CD…...

索引设计规范

索引是帮助数据库高效获取数据的数据结构。索引是加速查询的常用技术手段。在设计索引时&#xff0c;要遵循索引设计规范&#xff0c;避免不必要的踩坑。 【推荐】索引存储结构推荐BTREE InnoDB和MyISAM存储引擎表&#xff0c;索引类型必须为BTRER&#xff0c;MEMORY表可以根…...

Appium 2安装与使用java对Android进行自动化测试

文章目录 1、Appium 2.1安装1.1、系统要求1.2、安装Appium2.1服务1.3、安装UiAutomator2驱动1.4、安装Android SDK platform tools1.5、下载OpenJDK 2、Android自动代码例子2.1、安装Android自动化测试元素定位工具Appium Inspector2.2、编写android app自动化测试代码和使用ex…...

小程序运营方式有哪些?如何构建小程序运营框架?

​如今&#xff0c;每个企业基本都做过至少一个小程序&#xff0c;但由于小程序本身不具备流量、也很少有自然流量&#xff0c;因此并不是每个企业都懂如何运营小程序。想了解小程序运营方式方法有哪些&#xff1f; 在正式运营小程序前&#xff0c;了解小程序的功能与企业实际经…...

【golang】for语句和switch语句

使用携带range子句的for语句时需要注意哪些细节&#xff1f; numbers1 : []int{1, 2, 3, 4, 5, 6} for i : range numbers1 {if i 3 {numbers1[i] | i} } fmt.Println(numbers1)这段代码执行后会打印出什么内容&#xff1f; 答案&#xff1a;[1 2 3 7 5 6] 当for语句被执行…...

三、数据库索引

1、索引介绍 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 常见的索引结构有&#xff1a;B数&#xff0c;B树&#xff0c;Hash和红黑树等。在MySQL中&#xff0c;无论是 InnoDB还是MyISAM&#xff0c;都使用了B树作为索引…...

长时间带什么耳机最舒服,分享长时间佩戴舒服的耳机推荐

时代在进步&#xff0c;科技在不断革新。近年来&#xff0c;一种崭新的耳机——骨传导耳机&#xff0c;如火如荼地进驻耳机市场&#xff0c;引起一阵热潮。不论是平日里的工作出勤还是运动时的挥洒汗水&#xff0c;相比传统耳机&#xff0c;骨传导耳机无疑更加贴合现代生活的需…...

Yolov8小目标检测(1)

💡💡💡本文目标:通过原始基于yolov8的红外弱小目标检测,训练得到初版模型,进行问题点分析; 💡💡💡Yolo小目标检测,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,带你轻松实现小目标检测涨点 💡💡…...

GPS定位漂移问题分析

有很多种因素会影响到GPS的准确率&#xff0c;以下是一个GPS误差引入简表&#xff1a; l 卫星时钟误差&#xff1a;0-1.5米 l 卫星轨道误差&#xff1a;1-5米 l 电离层引入的误差&#xff1a;0-30米 l 大气层引入的误差&#xff1a;0-30米 l 接收机…...

建站边检站/网络营销推广技巧

目录计数类DP1.整数划分数位DP状压DP树形DP记忆化搜索计数类DP 1.整数划分 题意 : 给定一个数nnn,询问有多少种方法可以将其拆分成多个数的和,包括本身 思路 : 此题模板于 Acwing.自然数的拆分 状态表示与转移同理于01背包记录方案数 状态表示 : f[i]f[i]f[i]表示iii拆分的…...

南宁建网站/宁德seo

3 随机LSB替换隐写及RS检测方法【实验目的】设计并实现一种随机LSB替换隐写方法&#xff0c;并考察其抵抗卡方检测的能力&#xff1b;实现RS检测方法&#xff0c;并考察其检测随机LSB替换隐写的能力&#xff1b;设计其他可以检测随机LSB隐写的方法.【实验环境】Matlab7.1或以上…...

创新的商城网站建/厦门seo排名收费

今天写了一个在前端打印的功能&#xff0c;遇到了一个很坑的问题&#xff0c;设置的背景色打印的时候不起作用&#xff1a; 不起作用的css样式&#xff1a; .div_class2_1{color:white;float:left;background: #808080!important; width:80%;} .div_class3_1{color:white…...

做网站青岛/企业培训内容有哪些

概述首先同步下项目概况&#xff1a;上篇文章分享了&#xff0c;路由中间件 - 捕获异常&#xff0c;这篇文章咱们分享&#xff1a;路由中间件 - Jaeger 链路追踪。啥是链路追踪&#xff1f;我理解链路追踪其实是为微服务架构提供服务的&#xff0c;当一个请求中&#xff0c;请求…...

网站都到哪里做推广/口碑营销的产品

order by Order by&#xff0c;可以使用一列或者多个列对结果进行排序。如果存在多个排序字段&#xff0c;在前一个不能比较出结果后&#xff0c;后边的才起作用可以分别指明是升序还是降序&#xff1a;asc&#xff08;ascending&#xff09; desc&#xff08;descending&#…...

17一起做网站广州/网站建设需要啥

目录1.ECSHOP商品比较,如何限制每次比较的数量 2.将ECSHOP购买记录的用户名的后几位字符用***代替 3.ECSHOP商品页,加入购物车弹出浮动层,仿淘宝效果 4.在ECSHOP会员中心显示冻结资金 5.ECSHOP商品页购买记录的每页条数如何修改 6.ECSHOP信息提示页面的跳转时间设置. 7.在ECSHO…...