MySQL(九) 字符集

2021-10-07 12:07:17 字數 2082 閱讀 5609

編碼:字元 -> 二進位制;

解碼:二進位制 -> 字元;

為什麼會出現亂碼?因為編碼和解碼的規則不同。本質上都是同樣的一串二進位製流,按照不同的規則解讀的結果當然是不同的。模擬一下我們的時間戳轉時間的場景,時間戳就好比是二進位制,時區就好比是不同的字符集,同乙個時間戳用不同的時區轉換,得到的結果當然是不同的。所以,我們只要保證編碼和解碼用同一套字符集就不會出現亂碼了。

mysql裡支援的字符集

這裡主要指儲存資料的字符集。可以使用如下命令檢視:

show charset

另外我們可以設定不同級別的字符集,伺服器、資料庫、表、列四個級別。

儲存不同字符集的資料,消耗的空間是不同的。比如ascii字符集,就是固定乙個位元組。但是對於utf8字符集,需要1-3個位元組,這是變長字符集,所以空間是不固定的。

mysql中utf8其實指的是utf8mb3字符集,是mysql裡的一種原始utf8字符集的變種,原始的utf8字符集需要1-4位元組,而utf8mb3只需要1-3位元組。原始的utf8字符集在mysql裡叫utf8mb4。

字符集轉換

在客戶端發起一條sql語句,到接受服務端返回,這個過程中的字符集是如何轉換的?

1.客戶端使用mysql client發起sql語句查詢,此時在客戶端機器上,使用作業系統的字符集對命令進行了編碼,轉成了二進位製流傳送到網路中;

2.mysql服務端接受二進位製流,使用character_set_client指定的字符集解碼二進位製流;

3.將字元流使用character_set_connection指定的字符集轉換;

4.將字符集與列資料作比較;

5.將結果使用character_set_results指定的字符集編碼,返回給客戶端;

這裡有個問題,為什麼需要轉成character_set_connection?

這裡有一段解釋。意思是在做字元常量比較時,需要使用character_set_connection對常量進行轉換。啥意思?

比如select * from text where name = '哈哈'這條語句。服務端首先會用character_set_client解碼,然後處理語句。裡面的where查詢中的name列,會按照該列對應的字符集轉碼,但是對於常量『哈哈』怎麼處理?顯然如果不處理,那麼會按照character_set_client處理,但這可能有問題啊,可能會導致參與比較的雙方使用的字符集都不一樣,這還怎麼比?所以就需要再按照character_set_connection來轉換一次常量,所以character_set_connection貌似應該與比較的列名的字符集一致。

這裡有三種字符集需要設定?其實可以只用如下命令:

set names ***

便可以同時設定如上三個字符集。

幾個例子:

預設都是utf8編碼。

create table text (

name varchar(10)

) engine=innodb default charset=utf8;

mysql> insert into text values('我');

query ok, 1 row affected (0.01 sec)

建表並插入一條資料;

mysql> set character_set_results=gbk;

query ok, 0 rows affected (0.00 sec)

mysql> select * from text;

+------+

| name |

+------+

| ��     |

+------+

1 row in set (0.00 sec)

這裡設定了character_set_results為不同的編碼,導致查詢結果亂碼;

mysql> set character_set_connection = ascii;

query ok, 0 rows affected (0.00 sec)

mysql> select * from text where name = '我';

empty set, 1 warning (0.00 sec)

這是設定了character_set_connection,導致無法查到資料;

MySQL學習20 字符集

字符集 描述ascii 最簡單的西文編碼方案,主要用於顯示現代英語和其他西歐語言 使用1個位元組表示,可表示128個字元。gb2312 國家標準簡體中文字符集,相容ascii 使用2個位元組表示,能表示7445個符號,包括6763個漢字,幾乎覆蓋所有高頻率漢字。gbkgb2312的擴充套件,加入對繁...

mysql 集群字符集 Mysql 字符集

字符集與字元比較 字符集字符集是某種字元的集合,比如最常見的ascii碼,由127個字元組成,只需要乙個位元組就能表示 我們常說的字符集還是gbk iso utf8 mysql 我們使用得最多的字符集就是gbk 和 utf8了 他們都是變長字符集,如果字元在ascii範圍內就使用乙個位元組表示,其他...

mysql字符集 MySQL字符集選擇

一 怎樣選擇合適的字符集 對mysql資料庫來說,字符集很重要,因為資料庫儲存的資料大部分都是各種文字,字符集對資料庫的儲存,處理效能都會有所影響。主要考慮一下幾方面的因素 1.滿足應用支援語言的需求,應用處理各種各樣的文字,發布到使用不同語言的國家或地區,可以選擇unicode字符集,mysql的...