Navicat for Mysql 显示 emoji 表情符号乱码问题 — 其它乱码情况都可参考

news2024/11/17 11:28:15

系统环境:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot基于AOP注解方式实现Redis缓存

一、前言 Spring中的AOP(Aspect Oriented Programming)是基于代理的AOP实现,通过使用基于代理的技术,可以在不修改原有代码的情况下,对原有代码进行增强和改进。Spring AOP实现了面向切面编程的功能,将横切…

电工-捡测电动机绕组首尾端的电路接线图

电工捡测电动机绕组首尾端的电路接线图 若三相电动机绕组首尾端接错,电动机起动时,会引起振动、噪声、三相电流严重不平衡、电动机过热、转速降低,甚至电动机不转等故障。 可用交流电源和灯泡来检查电动机三相绕组的首尾端用以检测电动机首尾…

Vue3项目实战

目录 一、项目准备 二、基础语法应用 2.1、mixin应用 2.2、网络请求 2.3、显示与隐藏 2.4、编程式路由跳转 2.5、下载资料 2.6、调用方法 2.7、监听路由变化 2.8、pinia应用 (1)存储token(user.js) (2)全选全不选案例(car.js) 一、项目准备 下载: cnp…

Google Play上线问题及解决方案

将应用上线到Google Play商店也可能会面临一些问题,在上线应用到Google Play商店之前,确保你充分测试应用,遵循Google Play的开发者政策和要求,以及关注用户的反馈,这些都能帮助你尽可能地解决问题并提供优秀的用户体验…

opencv 案例实战02-停车场车牌识别SVM模型训练及验证

1. 整个识别的流程图: 2. 车牌定位中分割流程图: 三、车牌识别中字符分割流程图: 1.准备数据集 下载车牌相关字符样本用于训练和测试,本文使用14个汉字样本和34个数字跟字母样本,每个字符样本数为40,样本尺…

无涯教程-PHP - preg_replace()函数

preg_replace() - 语法 mixed preg_replace (mixed pattern, mixed replacement, mixed string [, int limit [, int &$count]] ); preg_replace()函数的操作与POSIX函数ereg_replace()相同,不同之处在于可以在模式和替换输入参数中使用正则表达式。 可选的输…

PowerJob的启动及使用

首先,本文中提到的server就是指powerjob-server模块(也就是powerJob的重点之一的调度服务) 一、初始化项目 1. PowerJob的下载 官方文档 2. 导入到IDEA中,下载依赖后,打开powerjob-server模块的a…

开发中常用的小脚本、工具

文章目录 1. mysql数据库相关1.1 查看数据库各表占用内存大小1.2 数据库字段脱敏脚本 1. mysql数据库相关 1.1 查看数据库各表占用内存大小 SELECT table_name, ROUND(((data_length index_length) / 1024 / 1024), 2) AS "Size (MB)" FROM information_schema.t…

Instagram合规运营的10条策略

Instagram每月活跃用户15亿,是跨境外贸开发客户与广告引流的常用工具。本文总结10条Instagram运营基本策略与原则,帮助各位跨境人更好的了解平台规则,规避风险,提高投放效率! 1、使用商业账号 企业在instagram 上进行…

高精度参考电压源是什么意思

高精度参考电压源是一种能够提供稳定、准确且可靠的参考电压的电路或器件。在电子系统中,参考电压起着至关重要的作用,它被用作比较、校准、测量等各种应用中的基准电压。高精度参考电压源能够提供高精度的参考电压,具有很低的温漂、噪声和漂…

软考A计划-系统集成项目管理工程师-项目变更管理

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

2023年天府杯A 题:震源属性识别模型构建与震级预测

基于数据分析的震源属性识别模型构建与震级预测问题的研究 问题一: 解题思路: 第一部: 对数据进行一个处理,将数据进行分类,求出数据中的最大值,最小值,极差,方差等等一系列特征数据。,将天然…

Git企业开发控制理论和实操-从入门到深入(三)|分支管理

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

PhantomJS+java 后端生成echart图表的图片

PhantomJSjava 后端生成echart图表的图片 前言源码效果实现echarts-convertPhantomJS实现echarts截图得到图片java延时读取base64数据 参考 前言 该项目仅用作个人学习使用 源码 地址 docker镜像: registry.cn-chengdu.aliyuncs.com/qinjie/java-phantomjs:1.0 …

【Git】代码误推送还原(真实项目环境,非纸上谈兵)

背景 RT, 我今天眼睛花了,不小心把工作分支【合并】到了一个不相干的功能分支上,并且代码已经推送到远程仓库了。于是,只能尝试还原到上一次提交中。 【合并】分支有一个点我们是不可避免的,文字很难描述,…

一文总结:如何在csdn中使用markdown写出精美文章

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

导出功能exportExcel (现成直接用)

1. 实体类字段上加 Excel(name "xxx"), 表示要导出的字段 Excel(name "订单号")private String orderNo; 2. controller (get请求) /*** 导出订单列表*/ApiOperation("导出订单列表")GetMapping("/export")public void export(HttpS…

Ompl初探

在/ompl-1.x.0/build/Release/bin下有很多生成的demo可执行文件 在终端执行 ./demo_Point2DPlanning 测试程序 #include <ompl/base/SpaceInformation.h> #include <ompl/base/spaces/SE3StateSpace.h> #include <ompl/base/StateSpace.h> #include <o…

Python“牵手”蘑菇街商品详情API接口运用场景及功能介绍,蘑菇街接口申请指南

蘑菇街是专注于时尚女性消费者的电子商务网站&#xff0c;是时尚和生活方式目的地。 蘑菇街通过形式多样的时尚内容等时尚商品&#xff0c;让人们在分享和发现流行趋势的同时&#xff0c;享受购物体验。蘑菇街不是一个购物平台&#xff0c;它是一个购物指南网站&#xff0c;帮…

python3对接godaddy API,实现自动更改域名解析(DDNS)

python3对接godaddy API&#xff0c;实现自动更改域名解析&#xff08;DDNS&#xff09; 文章开始前&#xff0c;先解释下如下问题&#xff1a; ①什么是域名解析&#xff1f; 域名解析一般是指通过一个域名指向IP地址&#xff08;A解析&#xff09;&#xff0c;然后我们访问…