• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

set names 命令在mysql中除了应付乱码还能做什么?_MySQL

mysql 搞代码 4年前 (2022-01-09) 29次浏览 已收录 0个评论

做一个实验,控制台进入mysql数据库,依次执行如下代码:

#创建数据库

create database it_1 charset utf8;

#进入数据库

use it_1;

#创建表

create table student(id int unsigned primary key auto_increment,stu_no char(9) not null,stu_name varchar(5) not null,stu_sex enum('男','女','保密') default '男',stu_age tinyint not null,c_id int unsigned);

#以上操作全部成功,下面的操作开始报错

#往表中插入记录

insert into student values(null,'itcast101','张三',default,18,1),(null,'itcast102','小李子',2,17,3);

结果会出现如下错误提示:

Data too long for colomn 'stu_name' at row 2#在第二行中'stu_name'字段输入的数据长度太长了

试着只运行第一行,即:

insert into student values(null,'itcast101','张三',default,18,1);#Query OK, 1 row affected

所以这里的异常现象可以描述为’stu_name’字段的预设长度为5个字符(即理论上预留了5个汉字的长度),但实际插入数据时最多只能插入2个汉字。

我马上想到了编码问题,便逐一查看各种可能影响的编码:

1.控制台的编码:gbk

2.student数据库的编码:utf-8

3.’stu_name’字段的编码可以通过如下规则确定:

a.如果字段设置了字符集就用字段设置

b.如果没有就找表字符集设置

c.如果还没有就找数据库字符集设置

d.如果还没有就找mysql系统配置的默认字符集

显然这里第c.条生效,’stu_本文来源gaodai$ma#com搞$$代**码)网8name’字段使用utf-8字符集

我知道数据库操作中字符编码不一致会导致乱码问题,而这里控制台中的默认编码与’stu_name’字段的编码明显不一致,数据库中会不会出现乱码呢,于是我用以下三条语句逐一进行测试:

select * from student;
desc student;
show create table student;

结果是都没有出现乱码。由于目前相关知识有限,于是我就凌乱了。。。

通过请教朋友有后,得到了这样的解决方法:

在建表前加入一条命令

set names gbk;

这条命令的作用是告知mysql服务器,从客户端传来的(这里是控制台输入的)信息采用字符集gbk,而且从mysql服务器发送回客户端的结果也要用字符集gbk。

如果不使用这个命令,那么控制台输入的信息实际采用字符集gbk,但mysql服务器误认为是utf-8字符集,不进行转换就接收了。由于utf-8字符集里中文使用三个字节来编码英文只用1个字节,gbk字符集里中、英文都是使用2个字节来编码,于是控制台传递过去的3个gbk码中文字符(6字节)没有被mysql服务器识别为中文,而是直接识别成了6个英文字符,所以超出了最长5个字符的字段长度限制,导致此处的错误出现。

set names 命令能做的原来不只是应付乱码问题。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:set names 命令在mysql中除了应付乱码还能做什么?_MySQL

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址