set names 命令在mysql中除了應付亂碼還能作什麼?

作一個實驗,控制檯進入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 命令能作的原來不僅是應付亂碼問題。

相關文章
相關標籤/搜索