1. 程式人生 > 資料庫 >mysql charset=utf8你真的弄明白意思了嗎

mysql charset=utf8你真的弄明白意思了嗎

1、先來檢視一個建表語句

create table student(
  sid int primary key aotu_increment,sname varchar(20) not null,age int
)charset=utf8;

思考一個問題:

  • 當我們建表時,不指定charset=utf8的時候,此時插入中文,為什麼會報錯呢?
  • 當指定charset=utf8後,再次插入中文,為什麼又可以插入中文,並且不亂碼呢?

2、檢視CMD黑視窗的字符集

開啟CMD黑視窗–>滑鼠放在視窗最上方–>點選滑鼠右鍵–>屬性–>點選選項

在這裡插入圖片描述

通過上圖可以知道:CMD中輸入文字使用的字元編碼是GBK。同時你在儲存檔案的時候,經常會看到ANSI字符集,這個代表的是本地字符集,我們在中國,本地字符集使用的就都是GBK編碼。

3、你注意這個問題了嗎?

在這裡插入圖片描述

客戶端client輸入的字元,都是採用GBK編碼的。mysql伺服器儲存的字元又是UTF8編碼的。那麼,我們對資料庫、表進行增刪改查,最後返回到客戶端介面中,要想保證字元不亂碼,肯定是經過了"編碼轉換過程的"。我要問的是,究竟是什麼東西完成了這個編碼的轉換過程的?

4、你不熟悉的幾個mysql操作命令

-- 檢視資料庫支援的所有的字符集(這句命令自己下去操作)。
mysql> show character set;
-- 檢視系統當前狀態,裡面可以看到部分字符集設定。
mysql> status;
-- 檢視系統字符集設定,包括所有的字符集設定
mysql> show variables like '%char%';

操作結果如下:

在這裡插入圖片描述

通過上圖我們可以看到有一個叫做"connection"的東西,中文名叫做"聯結器"。"聯結器"就是用來進行"編碼轉換過程"的。

1)聯結器的特性

① “聯結器的作用”:

連線客戶端與服務端,進行字符集的轉換。聯結器有這種自動轉換的功能。

② “聯結器的工作流程”:
Ⅰ首先,客戶端的字元先發給聯結器,聯結器選擇一種編碼將其轉換(轉換之後的編碼, 與聯結器的編碼格式一致),進行臨時儲存。
Ⅱ 接著,聯結器再次轉換成與伺服器一致的編碼,並最終儲存在伺服器中。
Ⅲ 然後,伺服器返回的結果,再次先通過聯結器,聯結器仍然是選擇一種編碼將其轉換(轉換之後的編碼, 與聯結器的編碼格式一致),進行臨時儲存。

Ⅳ 最後,聯結器再將結果轉化為與客戶端一致的字符集,就可以在客戶端正常顯示了。

2)圖示說明聯結器connection的作用

圖一:

在這裡插入圖片描述

圖一說明如下:

在這裡插入圖片描述

圖二:

在這裡插入圖片描述

圖二說明如下:

在這裡插入圖片描述

5、對上述兩個圖的實戰演示

1)首先,瞭解如下幾個程式碼。

-- 1)設定客戶端的字符集。
set character_set_client=gbk;
-- 2)設定聯結器的字符集。
set character_set_connection=utf8;
-- 3)設定返回結果的字符集。
set character_set_results=gbk;

2)程式碼演示過程,詳細地寫在如下連結中的sql檔案中,可以自行下載,檢視。

http://note.youdao.com/noteshare?id=3fe60a490637d1a51ac78bf4a9e7e4d0&sub=511D73BDDEA34D9BAC565249035D74A8

6、產生亂碼的兩個原因

解碼與實際編碼,不一致導致的亂碼,可修復

在傳輸過程中,由於編碼不一致,導致部分位元組丟失,造成的亂碼,不可修復。

1)編碼和解碼不一致導致的亂碼

在這裡插入圖片描述

2)傳輸過程中,丟失位元組導致的亂碼。

在這裡插入圖片描述

7、對實際情況的分析(什麼都不設定,系統預設是如何呢?)

1)仔細檢視如下圖片

在這裡插入圖片描述

根據上圖可以知道(好好理解下面的文字說明):

在這裡插入圖片描述

圖二:

在這裡插入圖片描述

2)set names gbk的含義

-- 當客戶端、聯結器、返回值的字符集相同,並且都是gbk的時候,我們可以採取如下的簡寫方式:
 set names gbk;
 -- 上述sql語句其實包含了如下三層意思:
 set character_set_client=gbk;
 set character_set_connection=gbk;
 set character_set_results=gbk;

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們