小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MySQL 字符集和校驗規(guī)則工作原理

 小仙女本仙人 2022-03-17

字符編碼相關(guān)參數(shù)

數(shù)據(jù)流中的轉(zhuǎn)碼過程

校驗規(guī)則

Tips:字符集和校驗規(guī)則總是相伴的

一 從簡單的建庫語句開始

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

db_name : 數(shù)據(jù)庫名 必填

db_charset:數(shù)據(jù)庫的字符集 缺省為服務(wù)器字符集

db_collation:數(shù)據(jù)庫的校驗規(guī)則 缺省為服務(wù)器校對規(guī)則

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

字符編碼:將特定的字符與二進(jìn)制碼建立一一映射的集合就是字符集。每種字符集對應(yīng)該種字符集的編碼方式。

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

以ASCII字符集為例

它基于羅馬字母表的編碼方式,他不能表示中文僅僅包含了 全部的英文大小寫和為數(shù)不多的特殊符號,每個字符一個字節(jié)低7位為編碼位最高位保留,有些地方最高位做了擴(kuò)充。增添了一些表格符號、運(yùn)算符等。總而言之1個字節(jié) 8bit 表示一個字符,因為一一對應(yīng),所有一共有 27個字符。擴(kuò)展字符集擁有28。

三 查看MySQL編碼方式

show variables like 'character%';
Variable_name Value 含義
character_set_client utf8mb4 # 客戶端來源數(shù)據(jù)字符集
character_set_connection utf8mb4 # 鏈接層字符集
character_set_database utf8mb4 當(dāng)前選中數(shù)據(jù)庫默認(rèn)字符集
character_set_filesystem binary 當(dāng)前文件系統(tǒng)的編碼格式
character_set_results utf8mb4 服務(wù)器返回的編碼格式
character_set_server utf8mb4 服務(wù)器的默認(rèn)編碼格式
character_set_system utf8 數(shù)據(jù)庫系統(tǒng)使用的編碼格式
character_sets_dir /usr/local/mysql-8.0.15-macos10.14-x86_64/share/charsets/. 數(shù)據(jù)庫字符集存放地址
  1. MySQL 一旦啟動不需要再來關(guān)心 character_set_filesystem、character_set_system、character_sets_dir三個變量,因為他們并不會造成亂碼的問題。系統(tǒng)文件存儲方式不需要關(guān)心,字符集存放位置于性能和MySQL業(yè)務(wù)無關(guān)、數(shù)據(jù)庫使用的編碼格式是元數(shù)據(jù)的存儲格式。理解MySQL編碼轉(zhuǎn)化原理不難理解。

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

    建表時,若未明確指定字符集,則采用當(dāng)前庫所采用的字符集。

    新增時記錄,修改表字段時,若未明確指定字符集,則采用當(dāng)前表所采用的字符集。

四 編碼方式和校驗規(guī)則在使用中的作用

1 連接的概念

一個連接:指的是連接服務(wù)器時所作的事情。 ——《MySQL手冊》

例如:客戶端發(fā)送SQL語句,例如查詢,通過連接發(fā)送到服務(wù)器。服務(wù)器通過連接發(fā)送響應(yīng)給客戶端,例如結(jié)果集。

2 一個提交的分解

  1. 客戶端發(fā)起 查詢

  2. 服務(wù)器使用character_set_client變量作為客戶端發(fā)送的查詢中使用的字符集。

  3. 服務(wù)器拿到 查詢 后用將character_set_client 編碼方式轉(zhuǎn)為 character_set_connection對應(yīng)的校驗規(guī)則為collation_connection, (如果查詢是文字字符串,也就是他們有某種字符格式的引介詞 例如_utf8,如果是列值,校驗規(guī)則將不依靠collation_connection)

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

  5. 關(guān)于:字符串對3的注解:**[_charset_name] 'String' [COLLATE collation_name] **

    1. [_charset_name]字符編碼 也就是引介詞,表示接下來的字符串的編碼方式。
    2. [COLLATE collation_name]表示該字符串的校驗匹配方式
    3. 來自官方文檔對引介詞的解釋:_charset_name表達(dá)式正式稱做一個引介詞。它告訴解析程序,“后面將要出現(xiàn)的字符串使用字符集X?!币驗橐郧叭藗儗Υ烁械嚼Щ?,我們強(qiáng)調(diào)引介詞不導(dǎo)致任何轉(zhuǎn)換; 它僅是一個符號,不改變字符串的值。引介詞在標(biāo)準(zhǔn)十六進(jìn)制字母和數(shù)字十六進(jìn)制符號(x'literal'和 0xnnnn)中是合法的,以及?(當(dāng)在一個編程語言接口中使用預(yù)處理的語句時進(jìn)行參數(shù)替換)。

3 更新和查詢轉(zhuǎn)碼過程

數(shù)據(jù)更新轉(zhuǎn)碼過程:character_set_client-->character_set_connection-->表字符集。

數(shù)據(jù)查詢轉(zhuǎn)碼過程:表字符集-->character_set_result

4 字符串的引介詞和校驗規(guī)則的確定

引介詞:_charset_name表達(dá)式正式稱做一個引介詞。它告訴解析程序,“后面將要出現(xiàn)的字符串使用字符集X?!币驗橐郧叭藗儗Υ烁械嚼Щ?,我們強(qiáng)調(diào)引介詞不導(dǎo)致任何轉(zhuǎn)換; 它僅是一個符號,不改變字符串的值。引介詞在標(biāo)準(zhǔn)十六進(jìn)制字母和數(shù)字十六進(jìn)制符號(x'literal'和 0xnnnn)中是合法的,以及?(當(dāng)在一個編程語言接口中使用預(yù)處理的語句時進(jìn)行參數(shù)替換)。

  • 如果指定了CHARACTER SET X和COLLATE Y,那么使用CHARACTER SET X和COLLATE Y。

  • 如果指定了CHARACTER SET X而沒有指定COLLATE Y,那么使用CHARACTER SET X和CHARACTER SET X的默認(rèn)校對規(guī)則。

  • 否則,使用通過character_set_connection 和 collation_connection系統(tǒng)變量給出的字符集和 校對規(guī)則。

Tips:COLLATE子句,能夠為一個查詢覆蓋任何默認(rèn)校對規(guī)則。MySQL手冊

5 關(guān)于校驗規(guī)則

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

常見操作

查看現(xiàn)在支持的所有編碼方式

show character set;

查看支持的所有檢驗規(guī)則

show collation;

查看字符編碼設(shè)置

show variables like 'character%';

查看當(dāng)前字符集和校對規(guī)則設(shè)置

show variables like 'collation_%';

設(shè)置編碼字符集

set names 'utf8';

修改數(shù)據(jù)庫字符集

alter database database_name character set xxx;

修改表的字符集

  1. 只修改表的字符集,影響后續(xù)該表新增列的默認(rèn)定義,已有列的字符集不受影響。
alter table table_name character set xxx;
  1. 同時修改表字符集和已有列字符集,并將已有數(shù)據(jù)進(jìn)行字符集編碼轉(zhuǎn)換。
alter table table_name convert to character set xxx;

修改列 字符集

alter table table_name modify col_name varchar(col_length) character set xxx;

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多