MySQL 字元集和校驗規則工作原理

来源:https://www.cnblogs.com/monkey-code/archive/2020/06/18/13158698.html
-Advertisement-
Play Games

字元編碼相關參數 數據流中的轉碼過程 校驗規則 Tips:字元集和校驗規則總是相伴的 一 從簡單的建庫語句開始 CREATE DATABASE [IF NOT EXISTS] <db_name> [[DEFAULT] CHARACTER SET <db_charset>] [[DEFAULT] CO ...


字元編碼相關參數

數據流中的轉碼過程

校驗規則

Tips:字元集和校驗規則總是相伴的

一 從簡單的建庫語句開始

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

db_name : 資料庫名 必填

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;

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CentOS7 源碼部署nginx nginx簡介: nginx是一款高性能的 HTTP 和反向代理 Nginx的優點: 1.高併發量:根據官方給出的數據,能夠支持高達 50,000 個併發連接數的響應 2.記憶體消耗少:處理靜態文件,同樣起web 服務,比apache 占用更少的記憶體及資源,所有它是 ...
  • 在安裝docker時候遇到很多問題,在這裡分享一下, 1.在國內使用docker官方的源真的是慢, https://download.docker.com/linux/centos/#Docker官方源 [root@localhost ~]# cat /etc/yum.repos.d/Docker- ...
  • 通過IP安全策略(以關閉135埠為例) (1) 依次打開“控制面板-->系統和安全-->管理工具-->本地安全策略-->ip安全策略,在本地電腦” (2)在本地組策略編輯器右邊空白處 右鍵單擊滑鼠,選擇“創建IP安全策略”,彈出IP安全策略嚮導對話框,單擊下一步;在出現的對話框中的名稱處寫“名稱 ...
  • Hello 大家好,我是TANZAME,我們又見面了。今天我們來聊聊怎麼手擼一個 Redis Cluster 集群客戶端,純手工有乾貨,您細品。 隨著業務增長,線上環境的QPS暴增,自然而然將當前的單機 Redis 切換到群集模式。燃鵝,我們悲劇地發現,ServiceStack.Redis這個官方推 ...
  • 註意環境變數的設置: 打開終端,輸入: open -e .bash_profile #打開環境變數設置文件 在文件中輸入: export PATH=${PATH}:/usr/local/mysql/bin 保存文件並退出。 安裝完成後,啟動進入的時候會出現這個錯誤: ERROR 1045 (2800 ...
  • MySQL的邏輯架構  連接器:負責用戶的身份認證和許可權校驗。 查詢緩存:這個在8.0以後的版本已經取締了,但是不影響設計思想的瞭解,即:當有一個SQL進來的時候,先會去匹配SQL語句,如果本地已經有緩存,即直接讀緩存,返回結果。乍一聽挺好的功能,為什麼會被取締呢?這存在一些設計理念的問題,MyS ...
  • CURSOR是強類型,SYS_REFCURSOR 是弱類型(類似C#的var)。 Cursor: create or replace package pkg as cursor cur is select 1 n from dual; type tcur is ref cursor return p ...
  • 約束概述 對數據表中數據的限制條件叫表的約束,目的是為了保證表中記錄的完整和有效。例如非空、唯一等。 查看約束 1 通過查看建表語句 查看表中的約束 show create table tb_name; 2 通過檢查約束表 查看約束 select * from information_schema. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...