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 字符集概念、原理及配置之图文详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87474.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android学习之路(8) Activity

本节引言: 本节开始讲解Android的四大组件之一的Activity(活动),先来看下官方对于Activity的介绍: 移动应用体验与桌面体验的不同之处在于,用户与应用的互动并不总是在同一位置开始,而是经常以不确定的方式开始。例如&…

【Unity自制手册】游戏基础API大全

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

docker搭建es+kibana

docker搭建eskibana 0 安装docker 如果是mac或者windows,可以直接安装Docker Desktop更加便捷。 前提条件: Docker可以运行在Windows、Mac、CentOS、Ubuntu等操作系统上 Docker支持以下的CentOS版本: CentOS 7 (64-bit)CentOS 6.5 (64-bit…

【点击新增一个下拉框 与前一个内容一样 但不能选同一个值】

点击新增一个下拉框 与前一个内容一样 但不能选同一个值 主要是看下拉选择el-option的disabled,注意不要混淆 <el-form label-width"120px" :model"form" ref"form" style"color: #fff"><template v-for"(trapolicy, i…

SpringCloud学习笔记(六)_Ribbon服务调用

Ribbon介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具 Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时、重试等。简单的说&#xff0c;就是…

神通数据库v7.0试用版安装步骤

网上找了下神通数据库的安装教程&#xff0c;发现都已经过时&#xff0c;或者安装受阻&#xff0c;于是直接从官网下载后尝试亲自安装了一遍适用版&#xff0c;在CentOS7(64bit)环境具体操作步骤如下&#xff1a; 1、安装 wget工具 yum install -y wget 2、安装rar解压工具 …

ssm学生公寓管理中心系统源码和论文

ssm学生公寓管理中心系统源码和论文057 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;…

Nexus 如何配置 Python 的私有仓库

Nexus 可作为一个代理来使用。 针对一些网络环境不好的公司&#xff0c;可以通过配置 Nexus 来作为远程的代理。 Group 概念 Nexus 有一个 Group 的概念&#xff0c;我们可以认为一个 Nexus 仓库的 Group 就是很多不同的仓库的集合。 从下面的配置中我们可以看到&#xff0…

用户端Web自动化测试_L3

目录&#xff1a; 浏览器复用Cookie 复用pageobject设计模式异常自动截图测试用例流程设计电子商务产品实战 1.浏览器复用 复用浏览器简介 为什么要学习复用浏览器&#xff1f; 自动化测试过程中&#xff0c;存在人为介入场景提高调试UI自动化测试脚本效率 复用已有浏览…

测试框架pytest教程(3)夹具-@pytest.fixture

内置fixture Fixture使用pytest.fixture装饰&#xff0c;pytest有一些内置的fixture 命令可以查看内置fixture pytest --fixtures fixture范围 在pytest中&#xff0c;夹具&#xff08;fixtures&#xff09;具有不同的作用范围&#xff08;scope&#xff09;&#xff0c;用于…

JAVA毕业设计095—基于Java+Springboot+Vue的酒店管理系统(源码+数据库)

基于JavaSpringbootVue的酒店管理系统(源码数据库)095 一、系统介绍 本系统前后端分离(网页端和app端都有) 本系统分为管理员、酒店管理员、酒店员工、用户四种角色(角色菜单可自行分配) 用户功能&#xff1a; 注册、登录、酒店搜索、酒店列表、酒店预订、我的收藏、我的订…

ACM模式(基础输入输出)

import java.lang.*; import java.util.*; public class Main{public static void main(String[] args){Scanner in new Scanner(System.in);while(in.hasNextInt()){//下一行是否有数据int ain.nextInt();int bin.nextInt();System.out.println(ab);}} }Java方法间的调用 http…

上海交大ACM班总教头团队重磅新作,带你动手学机器学习(文末赠书4本)

目录 0 写在前面1 什么是机器学习&#xff1f;2 ACM 班总教头&#xff1a;俞勇3 动手学习机器学习赠书活动 0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器…

git merge规则

参考文档&#xff1a;https://juejin.cn/post/7129333439299321887 丹尼尔&#xff1a;Hi&#xff0c;蛋兄&#xff0c;周杰伦都出新专辑了&#xff0c;你咋还不更新啊&#xff0c;真的打算半年一更啊&#xff1f; 蛋先生&#xff1a;好像确实是这样&#xff0c;要不&#xff0…

微信小程序的springboot实现 个人行程日程安排系统

本站后台采用Java的springboot框架进行后台管理开发&#xff0c;可以在浏览器上登录进行后台数据方面的管理&#xff0c;MySQL作为本地数据库&#xff0c;微信小程序用到了微信开发者工具&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特…

我是大运火炬手丨民营企业家极米钟波:大运精神激励企业不断创新、追求极致

7月26日&#xff0c;成都第31届世界大学生夏季运动会火炬传递成都站第五传递日活动&#xff0c;在成都3所高校以及东安湖体育公园继续进行。极米科技股份有限公司&#xff08;以下简称“极米科技”&#xff09;董事长钟波是第92棒火炬手。 火炬手钟波 大学求学在成都&#xff…

《知识图谱与大模型融合实践研究报告》发布,创邻科技参编

近期&#xff0c;第三届知识图谱产业发展论坛暨知识图谱与大模型融合研讨会在北京召开。会上&#xff0c;《知识图谱与大模型融合实践研究报告》正式发布&#xff01; 该白皮书是由中国电子技术标准化研究院依托知识图谱产业推进方阵、全国信标委人工智能分委会知识图谱工作组…

TCP可靠性机制

确认号/序列号/ACK TCP帮助确保数据的准确传递。为了做到这一点&#xff0c;其使用了一些特殊的标记和信息&#xff0c;其中包括序号、确认号和ACK字段。 其中&#xff0c;它将每个字节的数据都进行了编号. 即为序列号. 序列号&#xff1a;就像给书中的每一页都编了号码一样&a…

Redis三种持久化方式详解

一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储&#xff0c;如固态磁盘&#xff08;SSD&#xff09;。Redis提供了一系列持久性选项。其中包括&#xff1a; RDB&#xff08;快照&#xff09;&#xff1a;RDB持久性以指定的时间间隔执行数据集的时间点…