Mysql系列(三)—— Mysql字符集和比較規則

1、前言

字符集表示的是存儲的二進制與字符如何映射的關係,比較規則指的是字符如何排序的規則,好比字符若是使用order by到底按什麼規則進行排序。mysql

2、查看命令

查看支持的字符集命令是:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式],CHARACTER SET|CHARSET贊成,二者均可以用。sql

查看支持的比較規則命令是:SHOW COLLATION [LIKE 匹配的模式]數據庫

注意,比較規則的命名方式有必定規律,通常來講,知足:服務器

  • 比較規則名稱以與其關聯的字符集的名稱開頭編碼

  • 後邊緊跟着該比較規則主要做用於哪一種語言,好比utf8_polish_ci表示以波蘭語的規則比較,utf8_spanish_ci是以西班牙語的規則比較,utf8_general_ci是一種通用的比較規則。spa

  • 名稱後綴意味着該比較規則是否區分語言中的重音、大小寫啥的,具體能夠用的值以下:code

    後綴 英文釋義 描述
    _ai accent insensitive 不區分重音
    _as accent sensitive 區分重音
    _ci case insensitive 不區分大小寫
    _cs case sensitive 區分大小寫
    _bin binary 以二進制方式比較

好比咱們經常使用的utf8_general_ci這個比較規則是以ci結尾的,說明不區分大小寫進行比較。server

3、關於utf8與utfmb4

utf8和utfmb4是咱們經常使用的字符集,這二者有什麼區別勒?實際上真正的UTF-8 是1-4個字節,可是mysql裏面的utf8不是指的這個,而是指的utf8mb3,其中mb表示的是最多佔用多少個字節,mysql最開始爲了節省空間資源偷偷把utf-8給閹割了,用1-3個字節表示,實際上1-3個字節也足夠表示咱們日常使用的字符了。而實際上utfmb4纔是真正的utf8,能映射全部的unicode碼。blog

4、字符集和比較規則的級別

MySQL有4個級別的字符集和比較規則,包括服務器級別、數據庫級別、表級別、列級別,對於一個表的列,這幾個級別粒度越具體的越優先使用,在建立數據庫、表、列的時候,若是沒有具體指定用什麼字符集和比較規則,自動引用上一級別的配置。咱們接下來看看各個級別的字符集和比較規則具體怎麼設置。排序

服務器級別

系統變量 描述
character_set_server 服務器級別的字符集
collation_server 服務器級別的比較規則

如圖,服務器級別的字符集和比較規則由系統變量character_set_server和collation_server控制,查看和修改命令上一篇文章介紹過。咱們能夠經過啓動選項、配置文件、運行時更改來設置它。

數據庫級別

數據庫級別的字符集和比較規則的系統變量爲:

系統變量 描述
character_set_database 當前數據庫的字符集
collation_database 當前數據庫的比較規則

若是想查看當前數據庫使用的字符集和比較規則,可使用以上的變量值進行查看(前提是使用USE語句選擇當前默認數據庫,若是沒有默認數據庫,則變量與相應的服務器級系統變量具備相同的值)。

另外,這兩個變量是隻讀的,咱們不能直接修改這兩個值就把數據庫的字符集和比較規則改變了。這兩個值只能經過DDL語句去改變。語法格式爲:

CREATE DATABASE 數據庫名
    [[DEFAULT] CHARACTER SET 字符集名稱]
    [[DEFAULT] COLLATE 比較規則名稱];

ALTER DATABASE 數據庫名
    [[DEFAULT] CHARACTER SET 字符集名稱]
    [[DEFAULT] COLLATE 比較規則名稱];

表級別

編輯和修改:

`` CREATE TABLE 表名 (列的信息) [[DEFAULT] CHARACTER SET 字符集名稱] [COLLATE 比較規則名稱]]

ALTER TABLE 表名 [[DEFAULT] CHARACTER SET 字符集名稱] [COLLATE 比較規則名稱] ``

列級別

編輯和修改:

CREATE TABLE 表名(
    列名 字符串類型 [CHARACTER SET 字符集名稱] [COLLATE 比較規則名稱],
    其餘列...
);

ALTER TABLE 表名 MODIFY 列名 字符串類型 [CHARACTER SET 字符集名稱] [COLLATE 比較規則名稱];

另外

因爲字符集和比較規則是互相有聯繫的,若是咱們只修改字符集,則比較規則將變爲修改後的字符集默認的比較規則。,只修改比較規則,則字符集將變爲修改後的比較規則對應的字符集。

5、Mysql中字符集的轉換

咱們知道從客戶端發往服務器的請求本質上就是一個字符串,服務器向客戶端返回的結果本質上也是一個字符串,而字符串實際上是使用某種字符集編碼的二進制數據。這個字符串可不是使用一種字符集的編碼方式一條道走到黑的,從發送請求到返回結果這個過程當中伴隨着屢次字符集的轉換,在這個過程當中會用到3個系統變量:

系統變量 描述
character_set_client 服務器解碼請求時使用的字符集
character_set_connection 服務器處理請求時會把請求字符串從character_set_client轉爲character_set_connection
character_set_results 服務器向客戶端返回數據時使用的字符集

屢次轉碼流程如上圖,注意,若是某個列使用的字符集和character_set_connection表明的字符集不一致的話,還須要進行一次字符集轉換。通常狀況下要使用保持這三個變量的值和客戶端使用的字符集相同,省得沒必要要的編解碼開銷。

相關文章
相關標籤/搜索