MySQL 字符集和校驗規則工做流程

MySQL 字符集和校驗規則工做原理

字符編碼相關參數html

數據流中的轉碼過程mysql

校驗規則sql

Tips:字符集和校驗規則老是相伴的數據庫

一 從簡單的建庫語句開始

CREATE DATABASE [IF NOT EXISTS] <db_name>
[[DEFAULT] CHARACTER SET <db_charset>] 
[[DEFAULT] COLLATE <db_collation>];

db_name : 數據庫名 必填macos

db_charset:數據庫的字符集 缺省爲服務器字符集編程

db_collation:數據庫的校驗規則 缺省爲服務器校對規則服務器

二 字符集和字符編碼是什麼?

字符編碼:將特定的字符與二進制碼創建一一映射的集合就是字符集。每種字符集對應該種字符集的編碼方式。編程語言

常見的字符集有 僅支持英文和特殊字符的ASCII、支持中英文的GBK、支持世界全部字符的Unicode等等<UTF-8是Unicode字符集的子集,他們不是兩種編碼方式>。性能

以ASCII字符集爲例編碼

它基於羅馬字母表的編碼方式,他不能表示中文僅僅包含了 所有的英文大小寫和爲數很少的特殊符號,每一個字符一個字節低7位爲編碼位最高位保留,有些地方最高位作了擴充。增添了一些表格符號、運算符等。總而言之1個字節 8bit 表示一個字符,由於一一對應,全部一共有 27個字符。擴展字符集擁有28。

三 查看MySQL編碼方式

show variables like 'character%';
Variable_name Value 含義
character_set_client utf8mb4 # 客戶端來源數據字符集
character_set_connection utf8mb4 # 連接層字符集
character_set_database utf8mb4 當前選中數據庫默認字符集
character_set_filesystem binary 當前文件系統的編碼格式
character_set_results utf8mb4 服務器返回的編碼格式
character_set_server utf8mb4 服務器的默認編碼格式
character_set_system utf8 數據庫系統使用的編碼格式
character_sets_dir /usr/local/mysql-8.0.15-macos10.14-x86_64/share/charsets/. 數據庫字符集存放地址
  1. MySQL 一旦啓動不須要再來關心 character_set_filesystem、character_set_system、character_sets_dir三個變量,由於他們並不會形成亂碼的問題。系統文件存儲方式不須要關心,字符集存放位置於性能和MySQL業務無關、數據庫使用的編碼格式是元數據的存儲格式。理解MySQL編碼轉化原理不難理解。

  2. 建庫時,若未明確指定字符集,則採用character_set_server指定的字符集。

    建表時,若未明確指定字符集,則採用當前庫所採用的字符集。

    新增時記錄,修改表字段時,若未明確指定字符集,則採用當前表所採用的字符集。

四 編碼方式和校驗規則在使用中的做用

1 鏈接的概念

一個鏈接:指的是鏈接服務器時所做的事情。 ——《MySQL手冊》

例如:客戶端發送SQL語句,例如查詢,經過鏈接發送到服務器。服務器經過鏈接發送響應給客戶端,例如結果集。

2 一個提交的分解

  1. 客戶端發起 查詢

  2. 服務器使用character_set_client變量做爲客戶端發送的查詢中使用的字符集。

  3. 服務器拿到 查詢 後用將character_set_client 編碼方式轉爲 character_set_connection對應的校驗規則爲collation_connection, (若是查詢是文字字符串,也就是他們有某種字符格式的引介詞 例如_utf8,若是是列值,校驗規則將不依靠collation_connection)

  4. 服務器執行查詢的結果 將會 按照 character_set_results 編碼方式返回查詢結果到客戶端。包括結果數據,例如列值和結果元數據(如列名)。

  5. 關於:字符串對3的註解:**[_charset_name] 'String' [COLLATE collation_name] **

    1. [_charset_name]字符編碼 也就是引介詞,表示接下來的字符串的編碼方式。
    2. [COLLATE collation_name]表示該字符串的校驗匹配方式
    3. 來自官方文檔對引介詞的解釋:_charset_name表達式正式稱作一個引介詞。它告訴解析程序,「後面將要出現的字符串使用字符集X。」由於之前人們對此感到困惑,咱們強調引介詞不致使任何轉換; 它僅是一個符號,不改變字符串的值。引介詞在標準十六進制字母和數字十六進制符號(x'literal'和 0xnnnn)中是合法的,以及?(當在一個編程語言接口中使用預處理的語句時進行參數替換)。

3 更新和查詢轉碼過程

數據更新轉碼過程:character_set_client-->character_set_connection-->表字符集。

數據查詢轉碼過程:表字符集-->character_set_result

4 字符串的引介詞和校驗規則的肯定

引介詞:_charset_name表達式正式稱作一個引介詞。它告訴解析程序,「後面將要出現的字符串使用字符集X。」由於之前人們對此感到困惑,咱們強調引介詞不致使任何轉換; 它僅是一個符號,不改變字符串的值。引介詞在標準十六進制字母和數字十六進制符號(x'literal'和 0xnnnn)中是合法的,以及?(當在一個編程語言接口中使用預處理的語句時進行參數替換)。

  • 若是指定了CHARACTER SET X和COLLATE Y,那麼使用CHARACTER SET X和COLLATE Y。

  • 若是指定了CHARACTER SET X而沒有指定COLLATE Y,那麼使用CHARACTER SET X和CHARACTER SET X的默認校對規則。

  • 不然,使用經過character_set_connection 和 collation_connection系統變量給出的字符集和 校對規則。

Tips:COLLATE子句,可以爲一個查詢覆蓋任何默認校對規則。MySQL手冊

5 關於校驗規則

  1. 每一個字符集都有默認的校驗規則
  2. 兩個不一樣的字符集不能有一致的校驗規則
  3. 存在校對規則命名約定:以其相關的字符集名開始,中間包括一個語言名,而且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元)結束。

常見操做

查看如今支持的全部編碼方式

show character set;

查看支持的全部檢驗規則

show collation;

查看字符編碼設置

show variables like 'character%';

查看當前字符集和校對規則設置

show variables like 'collation_%';

設置編碼字符集

set names 'utf8';

修改數據庫字符集

alter database database_name character set xxx;

修改表的字符集

  1. 只修改表的字符集,影響後續該表新增列的默認定義,已有列的字符集不受影響。
alter table table_name character set xxx;
  1. 同時修改表字符集和已有列字符集,並將已有數據進行字符集編碼轉換。
alter table table_name convert to character set xxx;

修改列 字符集

alter table table_name modify col_name varchar(col_length) character set xxx;
相關文章
相關標籤/搜索