mysql字符乱码详解

MySQL字符集乱码 在使用MySQL数据库时,经常会遇到字符集乱码的问题。这种问题会导致数据库中存储的中文或特殊字符显示为乱码,给数据的查看和处理带来不便。当向MySQL数据库中插入或读取包含特殊字符的数据时,可能会出现字符集乱码的情况。 阅读详情

  在处理mysql中文时,我们常常遇到字符编码的问题,本来主要讲解其乱码产生的原因,并给出解决方案。

  字符原理

    Latin1是ISO-8859-1的别名是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号


     GBK总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。


     UTF8使用一至四字节编码,0x00–0x7F范围内是一位,和ASCII保持一致。其它字符用二至四个字节变长表示。

    提示

     1、0x00-0x7F区间,上述字符集是一致的,也就是说英文字符无需转码。

     2、不同编码,字符集合不完全一样,存在某字符集的字符无法映射到另外一个字符集。

          比如gbk编码中的中文字符,转成latin-1编码时,就找不到对应的二进制编码。Mysql做字符集转换的时候,gbk中文字符-               >latin-1,很多就转成'?'号(0x3f),这种大集合转成小集合,基本是不可逆的。

     实验

  •     首先用show variables like ‘character%’ 查看mysql支持的中文编码,结果如下
           
  •    创建三个表test_gbk,test_utf8,test_latin1,创建的时候字符集分别为gbk,utf8,latin1。表结构为
            

          创建的sql语句

           create table test_gbk (

                         name varchar(100) not null

            )engine = myisam character set gbk;    

  • 问题1

    -----------------------------------

    执行下列语句: 

    set names 'latin1'; 

    insert into test_latin1 values( '中'); //此处'中'为gbk格式

    select name from test_latin1;

    结果是乱码,还是正常显示?

     

    问题2

    -------------------------------------

    执行下列语句:

    set names 'gbk'; 

    insert into test_latin1 values( '中'); //此处'中'为gbk格式

    select name from test_latin1;

    结果是乱码,还是正常显示?

     

    问题3

    -------------------------------------

    执行下列语句:

    set names 'latin1'; 

    insert into test_utf8 values( '中'); //此处'中'为gbk格式

    select name from test_utf8;

    结果是乱码,还是正常显示?  

  • mysql执行过程

        对一个mysql的执行过程,字符集转换,一般涉及到一下三个步骤:

        1、收到请求,将请求数据从 character_set_client -> character_set_connection。

        2、内部操作,将数据从character_set_connection -> 表创建的字符集。

        3、结果输出,将数据从表创建的字符集 -> character_set_results。 

        当执行set names "charset"; 相当于把        

         character_set_client, character_set_connection,character_set_results 统一设置为"charset"。

 

  • 终端显示字符集

        此外如果你用securecrt终端来显示的话,如果不想乱码的话,appearance->character encoding也需要设置           成正确的字符集。

------------------------------------------------问题详解----------------------------------------------------------

问题1

-----------------------------------

执行下列语句: 

set names 'latin1'; 

insert into test_latin1 values( '中'); //此处'中'为gbk格式

select name from test_latin1;

结果是乱码,还是正常显示?

答:结果是正常显示。

 

执行流程如下:

1、set names 'latin1';相当于把character_set_client, character_set_connection,character_set_results 统一设置为'latin1'。

2、Character_set_client告诉mysql server,传入的是一个latin1编码的,也就是单字节流,'中'这个输入,其实当作了0xD6 D0传入。

3、因为character_set_client -> character_set_connection -> table charset -> character_set_results为 latin1 -> latin1 -> latin1 -> latin1, 编码完全一致,数据没有做任何转换,所以输入是0xD6 D0,最后的输出也还原为0xD6 D0。

4、如果你的securecrt的显示字符集设置为gbk,那么最后的输出0xD6 D0就会显示成'中'。

 

问题2

-------------------------------------

执行下列语句:

set names 'gbk'; 

insert into test_latin1 values( '中'); //此处'中'为gbk格式

select name from test_latin1;

结果是乱码,还是正常显示?

答:结果是乱码。

 

执行流程如下:

1、set names 'gbk';相当于把character_set_client, character_set_connection,character_set_results 统一设置为'gbk'。

2、Character_set_client告诉mysql server,传入的是一个gbk编码的,'中'这个输入,当作了0xD6 D0传入。

3、因为character_set_client -> character_set_connection -> table charset -> character_set_results为 gbk-> gbk-> latin1 -> gbk, 其中gbk-> latin1的时候,因为'中'这个字符在latin1字符集里找不到,就会转换成'?'号(0x3F),然后latin1->gbk,'?'号在gbk字符集里面也是0x3F,最后输出就是0x3F,即'?'号。

 

问题3

-------------------------------------

执行下列语句:

set names 'latin1'; 

insert into test_utf8 values( '中'); //此处'中'为gbk格式

select name from test_utf8;

结果是乱码,还是正常显示?

答:正常显示。

 

执行流程如下:

1、set names 'latin1';相当于把character_set_client, character_set_connection,character_set_results 统一设置为'latin1'。

2、Character_set_client告诉mysql server,传入的是一个latin1编码的,'中'这个输入,当作了0xD6 D0传入。

3、因为character_set_client -> character_set_connection -> table charset -> character_set_results为 latin1-> latin1-> utf8 -> latin1, 其中latin1-> utf8的时候,输入'中' (0xD6 D0)会当作两个字符进行utf8转换,转换为0xC3 96 C3 90,然后utf8->latin1的时候,会把0xC3 96转换成0xD6, 0xC3 90转成0x D0,最后输出0xD6 D0。负负得正,之所以数据没有失真的原因是因为小集合往大集合转,再转回来,操作可逆。

4、如果你的securecrt的显示字符集设置为gbk,那么最后的输出0xD6 D0就会显示成'中'。

 

--------------------------------------------------终极解决方案----------------------------------------------------

从上面的问题执行流程来看,有没有终极解决方案呢?其实很简单,表创建的字符集和set names都设置成同一个字符集,就基本可以满足输入数据不会在转换过程中失真,也就是说输入是什么,输出就是什么。建议有中文的都设置成utf8字符集,一劳永逸。

             
C++继承与多态 - 继承多态原理01 C++继承多态原理讲解 阅读详情

相关推荐

【CTFWP】ctfshow-web40

CTFWP:ctfshow-web40

LongL_GuYu的博客 1863

数据仓库入仓问题:mysql获取数据存在"UTF8": 0x00问题的转换

1、 invalid byte sequence for encoding “UTF8”: 0x00 要使用如下方案转换字段 replace(ifnull(first_name,null),char(‘0x00’),null) as first_name, 2、写入到csv时,无法写入完全的数据,定位后发现空值写入是 id|recipient_no|first_name|last_name|bus...

qq_22994783的博客 1755

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

mysql字符编码的设置以及mysql中文乱码的解决方法

最近在开发过程中,使用到mysql的数据库,而在将中文数据插入到数据库的时候出现了数据乱码的问题,在网上找了很多方法,问了很多人,试了很久才发现网上有的方法是不行的,因此在此记录下,以便他人查找。 查看字符编码 首先,将中文插入到数据库乱码是因为没有将数据库编码设置为支持中文的编码,mysql的默认编码是Latin1,不支持中文,应该设置为utf8查看自己的数据库编码是否已设置好,进入

yipiankongbai的专栏 6万+

解决Android UVCCamera stopPreview 报错 崩溃 闪退 问题

在使用libuvccamera库的UVCCamera时,经常在调用stopPreview关闭预览的时候,app直接崩溃闪退了,经过综合各种修改源码的方案,已解决这个问题,以下请参考: 首先找到android_usbfs.c,linux_usbfs.c两个原文件,在两个文件中都可以找到这段代码,按如下示例修改: 修改前: for (i = 0; i < num_urbs; i++) { if (urb == tpriv->iso_urbs[i]) { urb_idx = i + 1;

hanye2020的博客 3576

GD32单片机引脚复用指南:如何让JTAG接口的PA15/PB3发挥第二功能?

本文详细介绍了GD32F103Cx系列单片机如何通过AFIO模块进行引脚复用,特别是将默认用于JTAG调试接口的PA15、PB3等引脚释放为普通IO或复用功能引脚。文章从原理出发,结合代码实践,讲解了如何配置调试端口重映射,将JTAG引脚安全地转换为GPIO或定时器通道,并提供了常见问题排查与最佳实践,帮助开发者高效利用有限的引脚资源。

nept的博客 809

MYSQL中频繁的乱码问题终极解决

这个问题被问了好多遍了,干脆我写出来。 这个例子里用的编码是GB2312,如果你是其他的编码,修改GB2312为你自己的,比如UTF8 在MY.INI里添加: [mysql] default-character-set=gb2312 [mysqld] default-character-set=gb2312 然后重新启动MYSQL服务。 进入数据库 alter

tianmo2010的专栏 846

乐企增值税及附加税费预缴申报表填报能力说明文档V1.004

申报表填报,是指企业在自有业务系统中将算税结果数据按预填规则要求加工汇总后,进行申报表填报的过程。申报表填报前对纳税申报所需的前提条件进行校验。校验通过后,应用前序算税结果数据及预填规则进行纳税申报表预填,生成申报表数据。申报表数据通过申报业务规则校验后,经纳税人确认即完成申报表填报业务。

记录点滴 355

解决写入MYSQL乱码问题

乱码原因: 项目,mysql链接,mysql数据库(程序,库,表)中某一项编码不一致造成的项目 通过拦截器设置统一编码 可以通过spring的CharacterEncodingFilter设置<filter> <filter-name>characterEncodingFilter</filter-name> <filte...

yxkong的专栏 142

MEMS传感器技术深度解析:从原理到未来趋势的全面指南(智能驾驶赛道有戏)

在智能汽车每秒产生1GB数据的今天,在可穿戴设备厚度突破1毫米的极限挑战下,MEMS(微机电系统)传感器正以的三大核心优势,重塑着人类感知世界的方式。作为从业10年的MEMS工程师,我见证了这个领域从实验室走向量产的完整历程——从2005年汽车安全气囊中笨重的压阻式加速度计,到2025年智能手机中集成5种传感器的SoC芯片,MEMS技术正在书写传感器行业的摩尔定律新篇章。本文将带您穿透技术迷雾,深入解析MEMS传感器的技术密码,涵盖,并附独家整理的与。文末更提供,助您把握万亿级市场机遇。

优快云-新能源汽车研发测试专业博主 2301

Python自动化脚本:模拟鼠标键盘保持电脑在线状态

在计算机自动化领域,模拟用户输入是一项基础且实用的技术,其核心原理是通过程序生成鼠标或键盘事件来与操作系统交互。这项技术的价值在于能够自动化重复性操作,提升工作效率,并解决特定场景下的系统交互问题。PyAutoGUI作为Python生态中广泛使用的自动化库,封装了跨平台的底层API调用,为开发者提供了简洁统一的接口来实现输入模拟。在实际工程实践中,这类技术常应用于自动化测试、远程办公辅助、数据抓取等场景,帮助用户保持系统活跃状态,防止因无操作导致的锁屏或休眠中断任务。通过合理配置移动间隔和随机化模式,可以更

weixin_28713299的博客 578

C# mysql 插入数据,中文乱码的解决方法

其次连接字符串,在连接字符串最后面加上。首先检查数据库,字符集的类型是否是。OK,这样就可以插入中文了。

小浪雨的博客 824

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1030

MySQL字符集格式显示乱码问题

文章目录一、常见字符集格式乱码问题1.1 写入乱码1.2 查询乱码二、数据库文本写入/查询乱码原因2.1 常见字符集格式设置2.2 MySQL字符集转换过程2.3 字符集格式乱码原因三、如何解决处理字符集格式乱码 在数据库操作中,偶尔我们可能会碰到一些乱码问题,有时候是在进行数据写入时出现的乱码无法正常写入数据,有时候是数据查询的时候发现看到很多乱码显示,这些其实都是字符集格式导致的问题。面对乱码的问题,我们该如何解决处理这个问题? 一、常见字符集格式乱码问题 1.1 写入乱码 当进行数据写入时,字符集格

三思的博客 1123

VC中sqlite的使用

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

如何解决MySQL字符集乱码问题

MySQL自4.1版本推出之后由于中文的特殊性带来的乱码问题也随在互联网行业出现。主要原因就是不同字符集编码不同而产生的。本文简要介绍字符集相关知识及部分乱码情况的解决方式。

流風餘韻的专栏 3886

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

mysql乱码、字符集设置问题

排查mysql客户端中出现中文乱码的各种可能的原因。

aumonnn的博客 6518

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySQL解决字符乱码问题

MySQL 修改字符集 MySQL中对字符编码的操作 1)查看数据库的当前的字符编码 mysql > show variables like 'characher%'   参数说明: charcter_set_system:mysql所在系统使用的默认字符集; character_set_server:服

Al_assad的博客 1702

mysql字符集乱码问题_解决mysql字符集乱码问题

character-set-server/default-character-set:服务器字符集,默认情况下所采用的。character-set-database:数据库字符集。character-set-table:数据库表字符集。优先级依次增加。所以一般情况下只需要设置character-set-server,而在创建数据库和表时不特别指定字符集,这样统一采用character-set-se...

weixin_36060333的博客 379

mysql字符集文字乱码_MySQL字符集产生乱码的一些认识

//标题:MySQL字符集简单讲解(个人总结)//作者:dx_andy//时间:2007.8.27 晚//测试环境:win32 MySQL 5.0.45//原因:自己的MySQL出现乱码问题MySQL自4.1版本推出之后为我们国人带来的乱码问题也随之风弥整个互联网。主要原因就是不同字符集编码不同而产生的。先说一下MySQl的配置中都有哪几种字符集:MySQL 4.1的字符集支持(Character...

weixin_36370128的博客 178

mysql字符集乱码问题_mysql字符集乱码问题解决

基本概念• 字符(Character)是指人类语言中最小的表义符号。例如’A'、’B'等;•给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encoding)。例如,我们给字符’A'赋予数值0,给字符’B'赋予数值1,则0就是字符’A'的编码;• 给定一系列字符并赋予对应的编码后,所有这些字符和编码对组成的集合就是字符集(Character Set)。例如,...

weixin_31022521的博客 294

mysql 字符集乱码_修改MySQL字符集乱码及库字符集方法

修改MySQL字符集乱码及库字符集方法发布时间:2020-05-09 11:34:45来源:亿速云阅读:194作者:三月栏目:数据库下文主要给大家带来修改MySQL字符集乱码及库字符集方法,希望修改MySQL字符集乱码及库字符集方法能够带给大家实际用处,这也是我编辑这篇文章的主要目的。好了,废话不多说,大家直接看下文吧。统一字符集保证不乱码:建议中英文环境选择utf81.linux系统语言/etc...

weixin_36186183的博客 217

mysql 乱码_MySQL乱码之客户端字符集

作者 韩杰·沃趣科技MySQL数据库工程师出品 沃趣科技| 环境Red Hat Enterprise Linux Server release 7.4 (Maipo)MySQL 5.7.22| 现象查表的时候显示某个字段乱码#mysql-u-p-S/tmp/mysql.sockmysql>select*frommy_alimit1\G***********...

weixin_39991222的博客 150

mysql 字符乱码_mysql字符集乱码

很不多不注意数据库的乱码情况,导致字符出错:默认的是拉丁字符集:在这个库里面创建的表也是拉丁字符集:下面插入正常的数据:显示是正常的。当插入中文的时候:必须要把客户端设置为拉丁字符集。另一种方法是在外面编辑xpg.sql;然后用system倒入进去mysql不乱码的5种方法及不乱吗根源;set name2.在sql文件里面指定set name3.在命令中使用--default-charcater-...

weixin_28964423的博客 101

mysql e 乱码,MySQL字符集乱码问题的解决方法

MySQL字符集乱码问题的解决方法:MySQL自4.1版本推出之后由于中文的特殊性带来的乱码问题也随在互联网行业出现。主要原因就是不同字符集编码不同而产生的。本文简要介绍字符集相关知识及部分乱码情况的解决方式。 一、字符集本概念字符集的基本概念如下 :字符(Character)是指人类语言中最小的表义符号。例如’A’、’B’等 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数...

weixin_27645199的博客 642

mysql字符串乱码_解决Mysql字符串乱码

1 # 字符集和字符序23 字符集(character set):定义了字符以及字符编码。45 字符序(collation):定义了字符的比较规则。67 MySQL支持多种字符集 与 字符序。89 -一个字符集对应至少一种字符序(一般是1对多)。1011 -两个不同的字符集不能有相同的字符序。1213 -每个字符集都有默认的字符序。14 1. 查看字符集1516 SHOW CHARACTER S...

weixin_34305091的博客 362

mysql连接字符乱码_如何解决MySQL字符集乱码问题

变量 @a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的,假设此时编码为 A,也就是变量 @a 的编码。2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定,假设此时编码为 B。3. 经过 MySQL 一系列词法,语法解析等处理后,写入到表 t1,表 t1 的编码为 C。那这里编码 A、编码 B、编码 C 如果不兼容...

weixin_34665386的博客 387
上一篇: auto_ptr与shared_ptr 的区别
下一篇: lua脚本学习笔记
ExtraMan
博客等级 码龄14年 9粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值