在mysql客戶端與mysql服務端之間,存在著一個字元集轉換器。 character_set_client =>gbk:轉換器就知道客戶端發送過來的是gbk格式的編碼 character_set_connection=>gbk:將客戶端傳送過來的數據轉換成gbk格式 character_set_r ...
在mysql客戶端與mysql服務端之間,存在著一個字元集轉換器。 character_set_client =>gbk:轉換器就知道客戶端發送過來的是gbk格式的編碼 character_set_connection=>gbk:將客戶端傳送過來的數據轉換成gbk格式 character_set_results =>gbk: 註:以上三個字元集可以使用set names gbk來統一進行設置 例子: create table test( name varchar(64) NOT NULL )charset utf8;#這裡的utf8表示伺服器端的字元編碼 首先,往數據表test中插入一條數據 inert into test values('測試'); 則,數據“測試”在資料庫中是以“utf8”格式保存的 過程: 首先,通過mysql客戶端,將數據發送給Mysql伺服器,經過字元集轉換器的時候,由於character_set_connection 值為gbk,所以會將客戶端發送過來的數據轉為gbk格式,緊接著,字元集轉換器將數據要傳送給伺服器的時候,發現伺服器是以utf8保存數據的,所以,在其內部會自動將數據由gbk轉換成utf8格式 什麼時候會出現亂碼?
- 客戶端的數據格式與聲明的 character_set_client不符
通過show character set 語法,可以顯示所有可用的字元集 latin字元集 註意:Maxlen列顯示用於存儲一個字元的最大的位元組數目。 utf8字元集 gbk字元集 什麼時候會丟失數據? 對比以上三幅圖可以知道,每種字元集中,用於存儲一個字元的最大的位元組數目都不同,utf8最大,latin最小。所以在經過字元集轉換器的時候,如果處理不當,會造成數據丟失,而且是無法輓回的。 比如: 將character_set_connection的值改為lantin的時候 從客戶端發送過來的gbk數據,會被轉成lantin1格式,因為gbk格式的數據占用的字元數較多,從而會造成數據丟失 總結:
- character_set_client和character_set_results 一般情況下要一致,因為一個表示客戶端發送的數據格式,另一個表示客戶端接受的數據格式
- 為了避免造成數據丟失,需讓 character_set_connection的字元編碼 大於 character_set_client的字元編碼