MySQL燕十八老师课程笔记:第十八课:乱码问题全解

在本地文本文档打“联通”二字后保存,发现再次打开后显示乱码,但其他就没有这种问题。

键盘上127个字符,用一个字节就够存储了,原因:一个字节有八个位:0000 0000-1111 1111,一共有256种值。(事实上,7个位就够了,因为7个位可以表示128种变化)

ASCII码:0-127表示,最高位始终为0。

但对于中文,一个字节显然不够,这时我们需要用2个字节来表示:0000 0000 0000 0000->1111 1111 1111 1111 0->65535,6万多种组合,够用了。

在这里插入图片描述
此时的组合来自于:[129-255][129-255]
例:130 149 97 95 134 198 有几个中文,几个英文?
答:有2个中文,两个英文,分别是:中文英文英文中文。
但是中文的组合数也少了,只能组合10000,事实上,GB2312只能容纳6000多字。

GBK还是双字节,如何扩充容量?
答:GBK的第二位,低位,不再局限于129-255了,<127的也能用
例:140 35 65 179 82 其中有几个中文,几个英文?
答:中英中,一共有两个中文,一个英文。

总结:碰到>128的,就再往后找一字节,2字节理解成中文,继续找;否则就理解成ASCII

ANSI代表本地字符集,在中国操作:GBK,在日本操作:JIS

Unicode是一个全世界通用的码表,全世界范围的字符,都统一分配表好,这样就不会乱了。
用4个字节来编号。但是常用字符也就集中在前两个字节,这样就会有点麻烦。
此时:有一个办法:把高位浪费的0值,用一定的规则舍弃,这样形成的编码方式就是UTF-8

Unicode与UTF-8的关系:就像源文件->压缩文件的关系。
UTF-8:变长,那么如何确定字符的边界?
答:最高为有几个1,就往后取几个字节。

那么,如何截取UTF8(各国语言都有),无乱码?
答:从头开始,取1个字节,通过位运算,计算连续的1的个数。如为0,则截取1个字节;如为N,则截取N个字节。

从容量上看:GB2312<GBK<UTF-8

问:GBK中文经常在Java中,被转为UTF-8,怎么转的?
答:GBK和Unicode也有对应关系:GBK->Unicode->UTF-8

问:那么,乱码是怎么形成的?
答:乱码只有两种原因:1.解码时与实际编码不一致(可修复)2.传输过程中,编码不一致,导致字节丢失(不可修复)
2的例子:UTF-8转成GB2312,容量变小,导致有的字节丢失,这种情况不可修复。

具体转码过程:
连接器的特性:连接客户端与服务器,客户端的字符先发给连接器,连接器选择一种编码将其转换,临时存储。再次转换成服务器需要的编码

回到最初的那个问题:为什么“联通”在记事本保存后重新打开显示的是乱码?
原因:解码与实际编码不一致。保存时的格式默认为是ansi,即本地默认GBK格式。而记事本在打开时,也分不出你的编码,只能由编码的特点推测。字数较少时容易猜错。。。重新打开时记事本用的是utf-8格式打开的。
在xp下,用记事本创建utf8文件时,前面多了3个字节,这3个字节不用来显示,是用来辨识编码用的。

显示utf8+时,不是utf8,而是由bom头的utf8,这时设置编码为utf8,不要选utf8+,保存时也是。这样就不会出错了。

UTF8和UTF-8的区别:
UTF-8是一种编码,世界上UTF-8只有一个,即表达这种编码方式。
而在MySQL中,只有UTF8。

实例:中文截取乱码问题:
在这里插入图片描述===>
在这里插入图片描述
讨论建表时“engine myisam”的作用(MySQL引擎):
引擎:engine就是存储相同数据的不同方式,
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值