mysql字符集

转载:https://www.cnblogs.com/a757956132/p/4314891.html
https://www.yiibai.com/mysql/introduction-sql-views.html

一、字符集

1.mysql的字符集设置非常灵活

可以设置服务器默认字符集;

数据库默认字符集;

表默认字符集;

列字符集;

如果某一级别没有指定字符集,则继承上一级。

查看所有字符集语句:show character set;

2.以表声明为utf-8为例,最终存储在表中的数据为utf-8

在这里插入图片描述

①我们要告诉服务器,我给你发送的数据是什么编码?character_set_client

②告诉字符集转换器,转换成什么编码?character_set_connection

③查询的结果用什么编码?character_set_results

如果以上三者都为字符集N,可简写为set names N;

3.什么情况下会出现乱码呢?

我们首先创建一个测试表指定表的字符集为utf8

create table temp(

  name varchar(10)

) charset utf8;   //charset utf8;决定了服务器的编码

然后执行这三条命令:

set character_set_client=gbk;

set character_set_connection=gbk;

set_character_set_results=gbk; 这三句可以简写为set names gbk;

最后往表里插入一条数据:

insert into temp values('中国');

select * from temp;这时候显示的结果是正常的。

当我们再执行这句命令时:set character_results=utf8;

出现乱码了,如图:
在这里插入图片描述

由此可得出当返回的结果result的字符集与客户端的字符集不符的时候会出现乱码。

还有一种情况也会出现乱码:client声明与事实不符时,你客户端明明是utf8,你却非要叫我转成gbk的,如下图:
在这里插入图片描述

可能还有很多种情况,这里没有一一列举。

4.什么情况下会造成数据的丢失呢?

执行这三条语句:

set character_set_client=gbk;
set character_set_connection=latin1;
set character_set_results=gbk;
再往表里插入一条数据:insert into temp values('美国');

最后查询的时候结果如下图:
在这里插入图片描述

数据丢失了。

由此可得出当connection和服务器的字符集比client小时,会造成数据的丢失,可能用语不是很准确,但是能理解即可以了。个人理解,就跟java里面不同数据类型相互转换时一样,比如把double类型强制转换成int类型,就会造成精度的丢失一样。

。。。。。。

ag:

旧服务器,类似于谷歌等,服务器使用的编码是gbk或者是gb2312 ,现在开发的页面使用的都是utf8,如何才能保证数据的不丢失

解决:其中connection可以设置为gbk或者utf8都可以

在这里插入图片描述

二、校对集

如果有a B c D按照asc排序,此时默认排序后的结果还是a B c D ,并不是按照ASCII排序的

1.什么是校对集?

校对集:指字符集的排序规则。

查看所有校对集语句:show collation;

一种字符集可以有一个或多个排序规则。

show collation like 'utf8%';将显示所有关于utf8的校对集

以utf8为例,默认是使用utf8_general_ci校对集,也可以按二进制来排,utf8_bin

2.怎样声明校对集?

create table tableName
(
  ...
)charset utf8 collate utf8_general_ci;
注意:声明的校对集必须是字符集合法的校对集。比如你字符集是utf8,你不能声明gbk的校对集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值