技术分享 | 为什么我的 MySQL 客户端字符集为 latin1

MYSQL详解(持续更新) 去重语句: select distinct 列名 from 表名 字符类型转数值类型语句: select to_number('000123') from dual; 插入语句: insert into 表名 (字段) values (字段值) 新增表字段: alter table 表名 add (字段名 integer default 0 not null); 删除表字段: alter........................................ 阅读详情

作者:秦广飞

爱可生 DBA 团队成员,负责项目日常问题处理及公司平台问题排查,对数据库有兴趣,对技术有想法。一入 IT 深似海,从此节操是路人。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


问题背景

我司某客户最近在检查一批新安装的 MySQL 数据库时,发现了下面的现象:

  • 该批次的 MySQL 客户端字符集全部为 Latin1 ;
  • 而之前使用同样参数模板部署的 MySQL ,客户端字符集却为 utf8 ;

已知 MySQL 版本为 5.7.32 ,服务器操作系统为 Redhat 7 ,那么为什么两次安装的 MySQL 字符集会不一样呢?

字符集介绍

首先我们简单回顾下 MySQL 字符集的相关知识,MySQL 字符集大体可以分为下面两个方面:

  • Server 级别字符集
    • Server 级别的字符集,即数据存储到数据库时使用的字符集,又可以细化分为库级别、表级别和字段级别;
    • 一般来说,如果建库建表时没有特别指定,那么就会使用 Server 级别的字符集;
    • Server 级别的字符集可以使用 character_set_server 参数指定;
  • Client 级别字符集
    • Client 级别的字符集,即客户端连接进数据库时使用的字符集,分别由下面几个参数控制:
      • character_set_client:Server认为Client发送过来的请求是用该参数进行编码的,因此在收到请求后会使用该参数进行解码;
      • character_set_connection:Server内部处理请求字符串时,会从character_set_client转为character_set_connection,因此两个参数要一致;
      • character_set_results:Server返回查询结果给Client时,会根据character_set_results进行编码,然后再返回,因此也需要和character_set_client保持一致;
    • 也就是说,控制 Client 级别字符集的三个参数需要一致,可以使用下面的方法:
-- 数据库中直接修改
mysql> set names utf8;
  
-- 配置文件中修改,客户端重新连接
shell> vi /etc/my.cnf
[mysql]
default-character-set = utf8
shell>
  
-- mysql客户端使用的my.cnf文件,可以根据mysql --help | grep "my.cnf" 确认
shell> mysql --help | grep "my.cnf"
            order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
shell>

排查过程

回到这个问题,我们首先检查了之前安装的 MySQL 的字符集,确实为 utf8

之后,查看服务器上所有的 my.cnf 文件,发现无论是之前安装的还是最近一批安装的,都仅有 MySQL 运行时指定的 my.cnf 文件中有字符集相关参数:character_set_server=utf8mb4

最后,又查看了服务器上操作系统的字符集,发现有问题的为 en_US ,而原先的为 en_US.UTF-8

好像找到了问题出在哪里,测试环境验证下,果然当服务器字符集设置为 en_US 后,MySQL 客户端字符集变为了 Latin1

那么,为什么会这样呢,我们看下官方文档上是怎么说的:https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html#charset-connection-client-configuration

翻译下来,大致有两点含义:

  • mysql, mysqladmin, mysqlcheck, mysqlimport, and mysqlshow 这些客户端工具都有一个默认的字符集,MySQL 5.7 是 latin1 ,MySQL 8.0为 utf8mb4 ;
  • 每个客户端工具都会检测操作系统的字符集,比如Linux系统LANG环境变量的值,如果MySQL支持操作系统的字符集,就会使用操作系统的(这里支持包括不完全精确匹配时,OS字符集将映射到最接近的MySQL字符集);如果不支持,就使用客户端默认字符集;

我们知道en_US最接近的字符集就是Latin1,所以回到我们的问题,当服务器的字符集为en_US后,我们看到MySQL客户端字符集为Latin1 ,是不是可以理解了

而使用MySQL 8.0的客户端,能进一步验证当不能精确匹配时,就使用MySQL最接近的字符集:

调整服务器(Redhat 7 或 CentOS 7)的字符集可以参考下面的方式:

-- 立即生效,但重启后会丢失
shell> export LANG="en_US.UTF-8"
  
-- 永久生效
shell> vim /etc/locale.conf
LANG="en_US.UTF-8"
shell> source /etc/locale.conf

总结

  • 本次字符集与之前不一致的原因是,该批次虚拟机镜像的字符集有点问题,一般来说,Redhat 7 和 CentOS 7 都会是 en_US.UTF-8 ;
  • MySQL Server 级别的字符集,可以用 character_set_server 参数指定;
  • 控制 MySQL Client 级别字符集的三个参数需要保持一致,一般来说为utf8(MySQL 8.0 为 utf8mb4),同时又与 MySQL Client 所在服务器的字符集有关;
utf8mb4_general_ci Cause: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLI org.springframework.jdbc.UncategorizedSQLException: ### Error querying database. Cause: java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '=' ### The error may involve defaul... 阅读详情

相关推荐

MySQL之字符集与校对:深度解析与应用实践

在MySQL数据库的学习和使用过程中,字符集和校对规则是极为重要的知识点,它们影响着数据的存储、比较、查询等多个方面。今天,我将与大家分享这部分内容的学习心得,希望能和大家一起进步,更深入地掌握MySQL的应用技巧。

wj_rdk的博客 1434

mysql 乱码字符 latin1 characters 转换为 UTF8

背景:目前正在进行业务重构,需要对使用MySQL的业务库表进行重新设计,在迁移时,遇到了中文字符乱码问题(源库表的默认编码是LATIN1,新库表的默认编码为UTF8),故重新学习了下MySQL编码和解码相关知识,并整理了在遭遇乱码时的一些常用技巧。 比如我下面一张表是省市区的编码存储,导入之后数据库变成如下的乱码: 这个实际上是latin1字符编码。 如果我们直接查的话,那么需要转换一下: select id,parent_code,area_code,CONVERT(CAST(CONV.

lchmyhua88的博客 3517

Django连接MySQL/MariaDB的三层校验与字符集配置指南

Django数据库连接本质上是Python驱动、数据库服务与ORM三层协同的过程。其核心原理在于驱动(如mysqlclient或PyMySQL)通过MySQL协议与数据库服务通信,而字符集(如utf8mb4)和权限配置则决定了数据一致性与安全性。技术价值体现在避免乱码、静默失败及权限越界等典型问题。典型应用场景包括Ubuntu老旧系统部署、教学环境搭建及遗留项目维护。本文聚焦Django与MySQL/MariaDB在兼容性受限环境下的可验证接入方案,重点解析驱动编译陷阱、socket连接差异及utf8mb4

weixin_33730836的博客 556

mysql latin-1报错解决

加上charset='utf8' 就不会报错了.

m0_38056101的博客 895

MySQL从Latin1编码转换为UTF-8的经验分享

在某些情况下,我们可能需要将数据库中的字符编码从Latin1转换为UTF-8,以便支持更广泛的字符集和国际化字符。首先,创建一个新的数据库,使用UTF-8编码和适当的排序规则。下面是一些经验分享,演示了如何在MySQL中执行从Latin1编码到UTF-8编码的转换,并提供了相应的源代码示例。将"table_name"替换为表的实际名称,"column_name"替换为要更改的列的实际名称。请注意,更改表和列的编码将涉及重建表和重写数据,因此在执行此操作之前,请确保已备份所有重要数据。修改导出的SQL文件。

ZaxfSass的博客 974

World Creator地形导入UE

导出预设选择高度图(heigh map)格式选择PNG 16位,或者RAW 16位,需要反转y轴(与虚幻不同),命名格式会自动带一个× , 将×改成_ 或者删掉自己命名 (虚幻名称不支持x符号)导入虚幻 , 修改Z轴 , 就是用 地形最高 - 地形最低 , 然后除以512 , 再乘以100。把这个数字填入Z轴缩放 , 点击生成即可。

UE星空 2152

技术分享 | MySQL 字符集再探

作者:傅同学 爱可生研发部成员,主要负责中间件产品开发,热衷技术原理。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本公众号之前发表了一些关于MySQL字符集的文章: 从utf8转换成utf8mb4 、 字符集相关概念 、 有关SQL 语句 、 字符集注意事项 、 乱码问题. 近日, 在为 爱可生开源数据传输工具dtle 增加UTF-32字符集支持过程中,笔者又了解了一下 MySQL 字符集机制。下面补充说明一些内容: 1 字符集 ASCII .

ActionTech的博客 460

【一张图系列】别再混淆了!5分钟搞懂ERP、MES、PLC的职责边界与数据流》

《ERP、MES、PLC系统边界与协作解析》一文清晰阐述了制造业三大核心系统的角色分工与数据流转。文章将ERP比作企业"大脑"负责战略规划,MES作为车间"指挥官"负责执行调度,PLC则是设备"士兵"执行具体操作。通过一张架构图展示了从计划层到控制层的完整信息流:蓝色箭头表示指令下行(ERP→MES→PLC),橙色箭头代表数据上行反馈(PLC→MES→ERP)。文章强调理清系统边界对数字化转型、部门协作和项目实施的关键作用,并预告下期将深入解析ME

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 969

MySQL中varchar字段最大长度是多少

微信搜索『coder-home』,或者扫一扫右侧的二维码,关注『程序猿集锦』。了解更多干货分享,还有各类视频教程。扫描它,带走我。 文章目录背景字节和字符的区分为什么是varchar(255)而不是(256)varchar字段最大值是多少latin1字符集编码下utf8字符集编码下utf8mb4字符集编码下总结 背景 你是否知道MySQL中的varchar字段类型最大能够存储多少数据?它的最大长度是多少?为什么有时候定义一个varchar(10)的字段可以存储10个汉字,但是不能存...

程序猿集锦的博客 1万+

Zemax新手别慌!一文搞懂几何像差:从球差、慧差到色差的实战识别与优化

本文为Zemax新手提供几何像差实战指南,详细解析球差、彗差和色差的识别与优化方法。通过软件操作关键节点和实际项目决策逻辑,帮助光学设计师快速掌握像差诊断与优化技巧,提升光学设计效率。

weixin_42524708的博客 257

Ghidra逆向分析实战:从安装JDK到解析STM32的bin文件(附SVD插件配置)

本文详细介绍了使用Ghidra进行STM32固件逆向分析的完整流程,从JDK安装配置到SVD插件的应用。通过实战案例展示如何解析bin文件、恢复符号信息以及利用SVD插件识别外设寄存器,帮助开发者高效完成嵌入式设备的逆向工程任务。

weixin_29309475的博客 643

mysql convert 字符集_MySQL字符集和copy_and_convert

关于copy_and_convert在对MySQL做业务压力测试的时候,我们在perf结果中发现 copy_and_convert 是一个耗费cpu的操作。这个函数的意思,就是在字符集之间做内容转换。如果源和目标的字符集相同,就可以直接用memcpy,这显然比做字符集转换(按字节或字长拷贝更快,和节省cpu)当整个系统是CPU瓶颈时,我们希望能够减少这种cpu消耗。一次查询涉及的拷贝如果我们执行一...

weixin_39636226的博客 463

重访时间与覆盖分析的stk操作

1.打开stk 2.创建一个新的场景,命名为Test,选择地球为场景星球,若为金星,可在Central Body里选择Venus(金星自转周期慢,自转周期243天,卫星轨道变化不明显)(其中start stop时间可设置长一些) 3.插入一个AreaTarget或者place,以AreaTarget为例 选择Pattern,Add三个点(用法可见前面的博客,有时候编程的代码也可以帮助理解stk的操作) 4.插入Satellite,选择Orbit Wizard(若想设置卫星的六根数也可

weixin_42664107的博客 1万+

MySQL字符集详解

以前在Windows XP操作系统中安装完MySQL遇到的问题就是中文字符集问题,但是安装时默认选的是Latin1,但是Latin1不能完全支持中文字符集。导致的结果就是不能插入中文数据,插入就报错。寻觅了三天才把问题给解决了,首先修改数据库的默认字符集编码,然后修改数据库连接编码。然后删除建的数据库,再建表,问题解决。        09年8月我开始使用Ubuntu操作系统,装完MySQL

huangjianxiang1875的专栏 897

用C#+Avalonia写跨平台串口工具:Windows/macOS/Linux通吃,还能解析Modbus+画实时曲线

不管是串口还是蓝牙,核心操作都是“打开连接、发数据、收数据、关连接”,先定义一个// 通信设备接口:统一串口/蓝牙的操作// 连接状态变化事件(UI层订阅)// 接收数据事件(收到数据后触发)// 通信配置(不同设备配置不同,用泛型)// 通信设备接口:统一串口/蓝牙的操作 public interface ICommDevice : IDisposable {// 连接状态变化事件(UI层订阅) event Action < bool > OnConnectionChanged;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 996

Claude Code 100个真实案例 - 用AI绘制CAD机械图纸(工程师看了直呼内行)

本案例展示如何使用 Claude Code 配合 Python 的 `ezdxf` 库,从零开始生成专业级 CAD 机械图纸。我们将绘制一个完整的法兰盘零件图,包含主视图、俯视图、标注尺寸、粗糙度标记和标题栏,最终生成标准 DXF 文件,可直接在 AutoCAD 或 FreeCAD 中打开编辑。

yueyeguzhuo的专栏 892

MySQL数据库字符集乱码问题MySQL解压版安装教程

MySQL数据库字符集乱码问题MySQL解压版安装教程 本次情况是发现连接数据库,包括Java连接数据库,包括Java项目都配置了UTF,8编码,但是数据库的中文数据取出来,还是乱码,然后执行了mysql命令: SHOW VARIABLES LIKE 'character%' 发现编码竟然不是UTF8,而是latin1编码,然后我使用mysql命令,设置为UTF8编码之后,包括my.ini也设置完之后,发现安装版的MySQL重启这些配置是不生效的,所以重新装MySQL解压版 步骤①:解压官网下载的MySQ

EraWalker的博客 325

解码器选型参数,结构原理,工艺与注意问题总结

解码器芯片(Decoder Chip)是电子设备中的一个重要组件,通常用于处理、解释和输出存储在某种编码格式中的数据或信号。本文对解码器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1169

Mysql字符集设置指南_MySQL教程

 Mysql字符集设置指南_MySQL教程     推荐:Mysql 常见问题汇总 1、Mysql errono 1005 : 主外键不是完全一致 , 请检查如下几点: a、字段是否存在 b、类型是否一致(注意unsigned , powerdesign 生成问题) c、数据库引擎是否一致 d、字符编码是否一致 e、windows平台下注意修改lower_case_table_nam

java_2017_csdn的博客 290

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL字符集选择与utf8mb4配置全指南

字符集是数据库存储和处理文本数据的基础技术,决定了如何编码和显示多语言字符。其核心原理是将字符映射为二进制序列,不同字符集支持的编码范围存在关键差异。在MySQL中,正确的字符集配置直接影响数据完整性(如防止emoji乱码)、查询性能(索引效率)和排序准确性。utf8mb4作为完整的UTF-8实现,相比传统utf8支持4字节编码,能完美处理emoji、生僻字等现代应用场景。通过合理配置服务端参数、连接器和字段定义,开发者可以构建支持全球化的数据库系统,特别适用于社交应用、多语言网站等需要处理多样化字符的场景

weixin_34357436的博客 326

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MySQL字符集编码

MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了凯哥的文章,总结了这篇博文.本文主要是对mysql常见的字符集问题进行整理,如有错误,请大家指正. 1.MySQL字符集编码简单介绍 谈到字符集,总会跟编码扯上关系,有关字符集和...

weixin_33714884的博客 117

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

mysql表中数据乱码_mysql中插入表数据中文乱码问题的解决方法

一、问题开发中遇到将其它数据库数据插入到mysql数据库表中一直会报类似如下错误:Incorrect string value: '\xE6\x88\x91' for column 'name' at row 1二、分析1.我先去查了两个数据库表中此字段对应的类型都是 varchar,所以不存在类型不一致导致插入报错的问题。2. 排除字段类型不一致导致的错误后,我猜测是中文乱码问题,然后插入纯英文...

weixin_39939918的博客 216

Canal 同步 MySQL POINT 类型终极踩坑指南:从32字节“幽灵”数据到逆向修复

相信数据,而非猜测:当遇到诡异问题时,深入到最原始的二进制/十六进制层面,数据往往会告诉你真相。警惕字符集:字符集是后台开发的“万恶之源”之一,尤其是在处理二进制数据时,要对任何可能发生隐式转换的环节保持高度警惕。系统性排查:从客户端到服务端,从配置到软件版本,逐一排查,排除变量,是定位复杂问题的有效方法。最终,我们选择了方案二作为临时解决方案,快速恢复了业务,同时将方案一(升级Canal Server)列入了后续的技术优化清单中。

weixin_57742552的博客 1472

安装mysql后修改_安装MySQL之后修改编码方式

MySQL的默认编码是Latin1,不支持中文,要支持中午需要把数据库的默认编码修改为gbk或者utf8。linux系统下,修改MySQL数据库默认编码的步骤为:1, 停止MySQL的运行/etc/init.d/mysql start (stop) 为启动和停止服务器2, MySQL主配置文件为my.cnf,一般目录为/etc/mysqlvar/lib/mysql/ 放置的是数据库表文件夹,...

weixin_42614269的博客 183

mysql 清理乱码数据_MySQL存储数据乱码的问题解析

mysql的字符集设置有多个层级,在mysql中存储中文,如果不能正确设置字符集,很容易出现数据乱码。今天就有一个用户反馈他数据库中的数据下午1点多开始出现了乱码。在这里,我分享下具体问题的排查过程,以及解决的办法。(1) 排除客户端设置导致的显示乱码如果用户设置的mysql character_set_client跟客户端显示的字符集不一致,很容易导致中文数据乱码。设置session字符集为u...

weixin_42306002的博客 378

两个字段_MySQL中varchar类型字段最大长度是多少

关注我,获取更多分享。背景字节和字符的区分为什么是varchar(255)而不是(256)varchar字段最大值是多少latin1字符集编码下utf8字符集编码下utf8mb4字符集编码下总结背景你是否知道MySQL中的varchar字段类型最大能够存储多少数据?它的最大长度是多少?为什么有时候定义一个varchar(10)的字段可以存储10个汉字,但是不能存储超过10个长度的字母呢?为什么有时...

weixin_32325225的博客 256
上一篇: SQL审核 | 如何快速使用 SQLE 审核各种类型的数据库
下一篇: 分布式 | 数据库连接如何正确处理 TCP 连接三次握手失败
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值