MySql(二)——字符集和比較規則

MySql(二)——字符集和比較規則

一些重要的字符集

  1. ASCIIsql

    • 共收錄128個字符,包括空格、標點符號、數字、大小寫字母和一些不可見字符。因爲總共才128個字符,因此可使用1個字節來進行編碼
  2. ISO 8859-1數據庫

    • 共收錄256個字符,是在ASCII字符集的基礎上又擴充了128個西歐經常使用字符(包括德法兩國的字母),也可使用1個字節來進行編碼。這個字符集也有一個別名latin1
  3. GB2312服務器

    • 收錄漢字6763個,其餘文字符號682個。同時這種字符集又兼容ASCII字符集
    • 若是該字符在ASCII字符集中,則採用1字節編碼,不然採用2字節編碼
    • 這種表示一個字符須要的字節數可能不一樣的編碼方式稱爲:變長編碼方式
  4. GBK編碼

    • 在收錄字符範圍上對GB2312字符集做了擴充,編碼方式上兼容GB2312
  5. utf8code

    • 收錄地球上能想到的全部字符,並且還在不斷擴充。這種字符集兼容ASCII字符集,採用變長編碼方式,編碼一個字符須要使用1~4個字節
utf8只是Unicode字符集的一種編碼方案, Unicode字符集能夠採用 utf8utf16utf32這幾種編碼方案, utf8使用1~4個字節編碼一個字符, utf16使用2個或4個字節編碼一個字符, utf32使用4個字節編碼一個字符。

MySQL中支持的字符集和排序規則

MySQL中的utf8和utf8mb4server

  • utf8mb3:閹割過的utf8字符集,只使用1~3個字節表示字符
  • utf8mb4:正宗的utf8字符集,使用1~4個字節表示字符
在MySQL中 utf8utf8mb3的別名

字符集的查看
SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式]排序

比較規則的查看
SHOW COLLATION [LIKE 匹配的模式]ci

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

字符集和比較規則的應用

1. MySQL有4個級別的字符集和比較規則字符串

  1. 服務器級別
  2. 數據庫級別
  3. 表級別
  4. 列級別

2. 服務器級別it

  • 服務器級別的字符集:SHOW VARIABLES LIKE 'character_set_server'
  • 服務器級別的比較規則:SHOW VARIABLES LIKE 'collation_server'
  • 寫入配置文件:
[server]
character_set_server=utf8
collation_server=utf8_general_ci

3. 數據庫級別

  • 當前數據庫的字符集:SHOW VARIABLES LIKE 'character_set_database'
  • 當前數據庫的比較規則:SHOW VARIABLES LIKE 'collation_database'
  • 建立和修改數據庫的時候數據庫的字符集和比較規則
CREATE DATABASE 數據庫名
    [[DEFAULT] CHARACTER SET 字符集名稱]
    [[DEFAULT] COLLATE 比較規則名稱];

ALTER DATABASE 數據庫名
    [[DEFAULT] CHARACTER SET 字符集名稱]
    [[DEFAULT] COLLATE 比較規則名稱];
建立數據庫不指定字符集和比較規則,則默認使用服務器級別的字符集和比較規則

4. 表級別

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

ALTER TABLE 表名
    [[DEFAULT] CHARACTER SET 字符集名稱]
    [COLLATE 比較規則名稱]
若是建立和修改表的語句中沒有指明字符集和比較規則,將使用該表所在數據庫的字符集和比較規則做爲該表的字符集和比較規則

5.列級別

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

ALTER TABLE 表名 MODIFY 列名 字符串類型 [CHARACTER SET 字符集名稱] [COLLATE 比較規則名稱];
對於某個列來講,若是在建立和修改的語句中沒有指明字符集和比較規則,將使用該列所在表的字符集和比較規則做爲該列的字符集和比較規則

6.僅修改字符集或僅修改比較規則

  • 只修改字符集,則比較規則將變爲修改後的字符集默認的比較規則
  • 只修改比較規則,則字符集將變爲修改後的比較規則對應的字符集

7.各級別字符集和比較規則小結

  • 若是建立或修改列時沒有顯式的指定字符集和比較規則,則該列默認用表的字符集和比較規則
  • 若是建立或修改表時沒有顯式的指定字符集和比較規則,則該表默認用數據庫的字符集和比較規則
  • 若是建立或修改數據庫時沒有顯式的指定字符集和比較規則,則該數據庫默認用服務器的字符集和比較規則

客戶端和服務器通訊中的字符集

從發送請求到返回結果這個過程當中伴隨着屢次字符集的轉換,在這個過程當中會用到3個系統變量
系統變量 描述
character_set_client 服務器解碼請求時使用的字符集
character_set_connection 服務器運行過程當中使用的字符集
character_set_results 服務器向客戶端返回數據時使用的字符集
  • 服務器認爲客戶端發送過來的請求是用character_set_client編碼的
  • 服務器將把獲得的結果集使用character_set_results編碼後發送給客戶端
  • character_set_connection只是服務器在處理請求時使用的字符集,它是什麼其實沒多重要,可是必定要注意,該字符集包含的字符範圍必定涵蓋請求以及結果集中的字符,要否則會出現沒法將請求中的字符編碼成character_set_connection字符集或者沒法編碼結果集中的字符

SET NAMES 字符集名等價於:

  1. SET character_set_client = 字符集名;
  2. SET character_set_connection = 字符集名;
  3. SET character_set_results = 字符集名;

若是想寫進配置文件:

[client]
default-character-set=utf8
相關文章
相關標籤/搜索