欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

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

程序员文章站 2022-06-12 19:52:18
...
做一个实验,控制台进入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_name'字段使用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 命令能做的原来不只是应付乱码问题。