set names 命令在mysql中除了应付乱码还能做什么?
2014-04-13 00:00
393 查看
摘要: 我们都知道set names命令在mysql中解决乱码问题很有效,但它就这一个作用吗?分享一下我的一点小发现:)
做一个实验,控制台进入mysql数据库,依次执行如下代码:
#创建数据库
#进入数据库
#创建表
#以上操作全部成功,下面的操作开始报错
#往表中插入记录
结果会出现如下错误提示:
试着只运行第一行,即:
所以这里的异常现象可以描述为'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'字段的编码明显不一致,数据库中会不会出现乱码呢,于是我用以下三条语句逐一进行测试:
结果是都没有出现乱码。由于目前相关知识有限,于是我就凌乱了。。。
通过请教朋友有后,得到了这样的解决方法:
在建表前加入一条命令
这条命令的作用是告知mysql服务器,从客户端传来的(这里是控制台输入的)信息采用字符集gbk,而且从mysql服务器发送回客户端的结果也要用字符集gbk。
如果不使用这个命令,那么控制台输入的信息实际采用字符集gbk,但mysql服务器误认为是utf-8字符集,不进行转换就接收了。由于utf-8字符集里中文使用三个字节来编码英文只用1个字节,gbk字符集里中、英文都是使用2个字节来编码,于是控制台传递过去的3个gbk码中文字符(6字节)没有被mysql服务器识别为中文,而是直接识别成了6个英文字符,所以超出了最长5个字符的字段长度限制,导致此处的错误出现。
set names 命令能做的原来不只是应付乱码问题。
做一个实验,控制台进入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 命令能做的原来不只是应付乱码问题。
相关文章推荐
- 视频服务,除了实现盈利我们还能发掘些什么?
- 使用mysql命令窗口查看中文数据乱码的解决办法
- 谈谈MySQL乱码和set names
- mysql 使用set names 解决乱码问题的原理
- 解决MySQL在使用命令时中文字符出现乱码的问题
- MySQL 使用set names 解决乱码问题的原理
- 活动丨除了三点钟社群,我们还能做什么?
- mysql操作命令梳理(4)-中文乱码问题
- wampservers 中的mysql控制台遇到的错误(输入命令无响应、错误提示乱码)
- mysql 使用set names 解决乱码问题的原理
- ajax除了能无刷新提交数据,还能做什么用
- 面对国难,除了捐钱,我们IT人还能做什么?
- MySQL乱码问题以及utf8mb4字符集---utf8mb4和utf8有什么区别? emoji表情与utf8mb4
- UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题 分类: 测试 2013-08-02 14:16 371人阅读 评论(0) 收藏
- 大白话说期权——除了买涨买跌,我们还能怎么交易?二元期权又是什么鬼?
- mysql使用source 命令乱码问题解决方法
- UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题
- AlphaGO赢了_人工智能除了下棋还能做什么?
- 除了卡和网银,银行业信息化还能为客户带来什么?
- 除了软件开发,我们还能做什么?