作一個實驗,控制檯進入mysql數據庫,依次執行以下代碼:mysql
#建立數據庫sql
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);
結果會出現以下錯誤提示:
spa
Data too long for colomn 'stu_name' at row 2#在第二行中'stu_name'字段輸入的數據長度太長了
試着只運行第一行,即:
code
insert into student values(null,'itcast101','張三',default,18,1); #Query OK, 1 row affected
因此這裏的異常現象能夠描述爲'stu_name'字段的預設長度爲5個字符(即理論上預留了5個漢字的長度),但實際插入數據時最多隻能插入2個漢字。
utf-8
我立刻想到了編碼問題,便逐一查看各類可能影響的編碼:rem
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 命令能作的原來不僅是應付亂碼問題。