我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何进行mysql乱码产生的探讨

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何进行mysql乱码产生的探讨

这期内容当中小编将会给大家带来有关如何进行mysql乱码产生的探讨,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

实验一

1。首先,在下面情况下:

mysql> show variables like 'character_set_%';

+--------------------------+---------------------------------------+

| Variable_name            | Value                                 |

+--------------------------+---------------------------------------+

| character_set_client     | latin1                                |

| character_set_connection | latin1                                |

| character_set_database   | latin1                                |

| character_set_filesystem | binary                                |

| character_set_results    | latin1                                |

| character_set_server     | latin1                                |

| character_set_system     | utf8                                  |

| character_sets_dir       | D:\Programs\mysql5045\share\charsets\ |

+--------------------------+---------------------------------------+

建表,并加入3个记录:大,阿,爱

2。set character_set_results=utf8;

则显示:(cmd窗口中,cmd窗口代码页936)

大->麓贸

阿->掳垄

爱->掳庐

分析编码:

大U:5927,GBK:B4F3

麓U:9E93,GBK:C2B4

贸U:8D38,GBK:C3B3

阿U:963F,GBK:B0A2

掳U:63B3,GBK:C2B0

垄U:5784,GBK:C2A2

爱U:7231,GBK:B0AE

掳U:63B3,GBK:C2B0

庐U:5E90,GBK:C2AE

3。改成set character_set_results=gb2312;

一样是乱码

4。结论:

乱码的产生,是由于单字节向多字节扩展引起的。B0A2 如果作为单字节存储(虽然表示的是1个汉字,但是因为是latin1单字节,所以认为B0A2是不相关的两个字符),此时如果把character_set_results变成utf8多字节,那么数据库mysql 会试图把每个单字节扩展成近似的(不知道具体的算法)双字节。所以乱码

反之,多字节向单字节转换时,不会有变动,仅仅是原来2各字节表示的一个字符‘B0A2’变成了表示两个字符而已。---- 这个说法经验证是错误的。

数据库存储的内容(磁盘上,内存里)不会受character_set_的影响,只是提交,查询的过程中,受到字符集转换的影响。

实验二

1。

create table y (id int, name char(4)) default charset gb2312;

2。在不改变默认character_set_ 是latin1的情况下,如果插入一个汉字,则显示乱码

3。改成set names gb2312,显示没问题(cmd窗口中,cmd窗口代码页936)

4。我原以为如上述实验1种的结论2,“多字节向单字节转换时,不会有变动”。所以我开始以为,set names gb2312 后,把character_set_results 改成latin1,显示不会出问题。结果,

一个汉字,则显示一个问号;两个汉字,则显示两个问号的乱码(估计一个问号代表一个字符)。也就是说,改成character_set_results = latin1后,多字节的数据存储,在向单字节表示转换时,mysql把提出的信息“缩水了”,把两个字节,换算成了一个字节。

5。如何,不让mysql缩水呢,我想到了character_set_results = binary;结果,果然显示正常。

PS

开发的使用mysql的应用程序,是对应作为独立的使用自己的character_set_client的字符集的

cmd 窗口登陆mysql,也是作为一个独立的,拥有自己character_set_client变量的应用

同理,打开不同的cmd窗口,都拥有独自的character_set_client变量

实验三07/16/2010

1。建一个默认字符集utf8的表(用navicat ,在utf8的界面下 代码页65001),并且插入utf8编码的汉字;大学;

2。切换到mysql console(代码页936)

3。set names gbk; 然后显示刚才所建立的表,能正确现实吗?---- 能!当然,只把character_set_results 成gbk,也能正常显示

实验四

1。mysql console(代码页936)建立一个表x3 ( name char(32) ),默认字符集default charset gbk;

2。默认环境变量  

| character_set_client     | latin1

| character_set_connection | latin1

| character_set_database   | latin1

| character_set_filesystem | binary

| character_set_results    | latin1

| character_set_server     | latin1

| character_set_system     |utf8 //不知道对以下过程、分析是否有影响

character_set_client   character_set_connection character_set_results 是latin1的情况下,插入数据:insert x3 values('大');

显示:ERROR 1406 (22001): Data too long for column 'name' at row 1

3。set character_set_client=gbk;然后insert x3 values('大');插入没有问题,但显然,数据经过 (character_set_connection=latin1)的转换,已经是有损了

4。不管character_set_results 设不设成gbk,都不能正常显示结果

5。set names gbk;则插入现实都没问题。并且此时,一个uf8字符集的表的显示也没问题(实验三)。而且进行连接查询,亦没问题。

6。当然,set names utf8,如果在一个utf8的软件界面上,显示输出也没问题(navicat 验证了)

7。如果设成set names binary。在936代码页的显示界面上,可以看到,x3依然可以正常现实;但像实验三那样建的表就不能正常显示了。

--------

分析第2点:Data too long for column 'name' at row 1

我的char 够长,插入数据够短,所以不是数据太长了。也就是说这个提示是错误的。

我知道,如果表x3 默认字符集 是latin1的话,插入是没问题的(一直以来都是这么玩的);这是因为,虽然输入端mysql console 代码页是936,但因为三个主环境变量character_set_c%都是latin1,所以,mysql 认为insert x3 values('大') 输入的是2个字符(当然,如果从utf8界面输入,可能就认为是输入3个字符)。存储的自然也是2个字符。显示的时候也是显示的2个字符,只不过936代码页把这两个字符自然组合,显示成汉字了(早期环境常见现象)。

当默认字符集变为gbk的时候,发生了什么?不知道。。。。。

实验五

一个很狗屎的问题出现了:936  console

环境变量如 实验一.1。

mysql> set names latin1;

Query OK, 0 rows affected (0.00 sec)

mysql> create table x4 (

    -> name char(32) primary key);

Query OK, 0 rows affected (0.09 sec)

mysql> drop table x4;

Query OK, 0 rows affected (0.06 sec)

mysql> create table x4 (

    -> name char(32) primary key) default charset utf8;

Query OK, 0 rows affected (0.10 sec)

mysql> insert x4 values('乃');

Query OK, 1 row affected (0.04 sec)

mysql> create table x5 (

    -> name char(32) primary key) default charset gbk;

Query OK, 0 rows affected (0.09 sec)

mysql> insert x5 values('乃');

ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql>

结论,我实在对实验四中分析的第3点做出结论。character_set_system utf8 有关~~  

上述就是小编为大家分享的如何进行mysql乱码产生的探讨了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何进行mysql乱码产生的探讨

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何进行C#回车切换焦点实现的探讨

今天就跟大家聊聊有关如何进行C#回车切换焦点实现的探讨,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#回车切换焦点实现的探讨,我们在学习 Windows程序中Tab键是默认的切换输
2023-06-17

如何进行Java多线程同步机制的深入探讨

今天就跟大家聊聊有关如何进行Java多线程同步机制的深入探讨,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在很多程序员的脑海中Java多线程都会占据一定的位置,众所周知,在Java多
2023-06-17

如何进行C++代码的代码生成?

如何进行C++代码的代码生成?代码生成是软件开发中的一个重要环节,可以提高开发效率和代码质量。而对于C++开发来说,代码生成更是具有重要意义。本文将介绍如何进行C++代码的代码生成,帮助开发者提高开发效率和代码质量。使用模板库使用模板库是进
如何进行C++代码的代码生成?
2023-11-02

如何进行大数据中报表工具制表能力的探讨

这期内容当中小编将会给大家带来有关如何进行大数据中报表工具制表能力的探讨,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。所谓报表工具,最核心最本质的功能,就是它的制表能力,即是否能够不写代码而制作出自己需要
2023-06-03

如何进行Python 中文乱码问题的分析

本篇文章给大家分享的是有关如何进行Python 中文乱码问题的分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。建立一个文件test.txt,文件格式用ANSI,内容为:abc
2023-06-17

如何进行对网站搜索规则以及排名规则的探讨

本篇文章为大家展示了如何进行对网站搜索规则以及排名规则的探讨,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。笔者的好几个朋友都开起了淘宝店,有做兼职店长的,有做专职店长的。最近两年淘宝新开店铺数量迅速
2023-06-12

如何进行对PDM产品数据管理方法的探索与研究

这期内容当中小编将会给大家带来有关如何进行对PDM产品数据管理方法的探索与研究,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。产品数据管理其实是一项非常复杂的工作,在产品设计中可以通过产品数据管理将产品信息
2023-06-05

如何用访问代码进行产品描述的权限控制

在企业的日常管理中,处于权限管理需要,可能需要实行代码化的管理,即操作人员只需要按照产品编码进行收发作业,只有研发人员才可以看到其详细描述,比如很多化工食品行业,考虑到用料保密的需要,都会有这一管理需求。Sage X3访问代码可以实现这一
2023-06-05

如何使用fdopen实现对Python进程产生的文件进行权限最小化配置

今天小编给大家分享一下如何使用fdopen实现对Python进程产生的文件进行权限最小化配置的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起
2023-07-05

如何进行dom4j解析及解决写入XML文档时的乱码问题

如何进行dom4j解析及解决写入XML文档时的乱码问题,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。book.xml
2023-06-17

如何对Python编译PyInstaller打包生成的exe文件进行反编译生成pyc、py源代码文件

很多开发者没有发布源程序代码,而是将代码封装为exe可执行文件,这样不仅更有利于程序传播,下面这篇文章主要介绍了如何对Python编译PyInstaller打包生成的exe文件进行反编译生成pyc、py源代码文件的相关资料,需要的朋友可以参考下
2023-01-18

如何使用PHP进行图片验证码的生成和验证?(PHP生成和验证图片验证码的方法是什么?)

这篇文章介绍了如何使用PHP生成和验证图片验证码。它涉及使用imagecreate()创建画布、imagecolorallocate()设置背景色、substr(md5(uniqid()),0,5)生成随机字符串、imagettftext()绘制字符、imageline()添加干扰线和header("Content-type:image/jpeg")以及imagejpeg($image)输出图像的步骤。验证需要比较用户输入和存储在会话中的验证码。
如何使用PHP进行图片验证码的生成和验证?(PHP生成和验证图片验证码的方法是什么?)
2024-04-02

编程热搜

目录