MySQL 字符集與比較規則
由於 MySQL 客戶端與服務端之間通信時需要將字符串編碼傳輸,所以不可避免會產生編碼轉換
字符集
MySQL 中 utf8
就是 utf8mb3
,只使用 1~3 個字節表示字符
utf-8md4
使用 1~4 個字節表示字符
相關參數
MySQL 服務器有以下幾個參數與編碼有關
字符集相關參數:
character_set_server
服務器級別的字符集
character_set_database
當前數據庫的字符集 (如果沒有使用 USE 選擇數據庫,則查看服務器級別的字符集) 只讀,無法通過修改改變當前數據庫參數
字符集轉換相關參數:
character_set_client
服務器會認為客戶端發送的請求為這個字符集,會將請求以這個字符集的形式進行解碼,獲取請求內容
character_set_connection
服務器內部處理請求時使用的字符集,服務器會將客戶端的請求以這個字符集的形式進行編碼 (如果與處理的數據字符集不同就會再進行一次轉換)
character_set_results
服務器會將返回的結果以這個字符集的形式進行編碼后返回給客戶端
查看命令
MySQL 支持許多字符集,通過以下命令可以查看所有支持的字符集
SHOW CHARACTER SET;
SHOW CHARSET;
其中 Default collation
就是這種字符集的默認比較規則,Maxlen
就是這種字符集表示一個字符最多需要的字節數
查看其他參數
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_connection';
SHOW VARIABLES LIKE 'character_set_results';
設置命令
設置字符集參數
服務器級別:
SET character_set_server 字符集名;
數據庫級別:
CREATE DATABASE 數據庫名
CHARACTER SET 字符集名稱;
ALTER DATABASE 數據庫名
CHARACTER SET 字符集名稱;
表級別
CREATE TABLE 表名 (列的信息)
CHARACTER SET 字符集名稱;
ALTER TABLE 表名
CHARACTER SET 字符集名稱;
列級別
CREATE TABLE 表名(列名 字符串類型 CHARACTER SET 字符集名稱);
ALTER TABLE 表名 MODIFY 列名 字符串類型 CHARACTER SET 字符集名稱 ;
設置字符集轉換參數
一般為了方便會將三個參數設置為同一字符集
使用以下命令就可以同時設置三個參數
SET NAMES 字符集名;
當然也可以分開設置
SET character_set_client = 字符集名;
SET character_set_connection = 字符集名;
SET character_set_results = 字符集名;
比較規則
比較規則有時也稱為排序規則,用於在字符串比較大小時規定其順序的
同一種字符集可以有多種比較規則
命名規則
每一種字符集都可能對應多種比較規則,這些比較規則命名規律為
- 比較規則名稱以對應的字符集名稱開頭
- 中間部分表示主要用於哪種語言
- 后綴有以下幾種:
后綴 | 全稱 | 含義 |
---|---|---|
`_ai` | accent insensitive | 不區分重音 |
`_as` | accent sensitive | 區分重音 |
`_ci` | case insensitive | 不區分大小寫 |
`_cs` | case sensitive | 區分大小寫 |
`_bin` | binary | 以二進制方式比較 |
相關參數
collation_server
服務器級別的比較規則
collation_database
當前數據庫的比較規則 (如果沒有使用 USE 選擇數據庫,則查看服務器級別的比較規則) 只讀,無法通過修改改變當前數據庫參數
查看命令
將比較規則全部列出來比較多,可以根據對應的字符集進行篩選
SHOW COLLATION;
SHOW COLLATION LIKE 'utf8\_%';
其中 Charset
表示對應的字符集,Default
表示是否為默認比較規則
設置命令
設置比較規則參數
服務器級別:
SET collation_server 比較規則名;
數據庫級別:
CREATE DATABASE 數據庫名
COLLATE 比較規則名稱;
ALTER DATABASE 數據庫名
COLLATE 比較規則名稱;
表級別
CREATE TABLE 表名 (列的信息)
COLLATE 比較規則名稱;
ALTER TABLE 表名
COLLATE 比較規則名稱;
列級別
CREATE TABLE 表名(列名 字符串類型 COLLATE 比較規則名稱);
ALTER TABLE 表名 MODIFY 列名 字符串類型 COLLATE 比較規則名稱 ;
總結
當只修改某個級別的字符集或比較規則時,相同級別對應的比較規則或字符集也會跟着改變為對應的 (默認的)
當創建數據庫時如果沒有指定字符集和比較規則,則默認使用服務器級別的參數
創建表時沒有指定字符集和比較規則,則默認使用表所在數據庫的參數
創建列時沒有指定字符集和比較規則,則默認使用列所在表的參數