MySQL基礎知識:Character Set和Collation


A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set.

  • Character Set: 一套字符及其編碼,即字符集;(文中很多地方也用 charset 一詞)
  • Collation:在字符集內用於比較或排序字符的一套規則,即校驗規則。

操作系統環境為MacOS Catalina, MySQL版本為: 8.0.13 MySQL Community Server - GPL

MySQL Charset和Collation簡述

  • MySQL服務器支持多種字符集(Character Set)
  • 每個字符集至少有一個Collation
  • 大部分字符集都有多個Collation
  • 每個字符集都有一個默認的Collation
  • 兩個不同的字符集不會有相同的Collation
  • MySQL可以在服務器、數據庫、表或字段 級別 指定使用的字符集

Collation后綴

Suffix Meaning
_ai Accent-insensitive
_as Accent-sensitive
_ci Case-insensitive
_cs Case-sensitive
_ks Kana-sensitive
_bin Binary
  • 非binary的collation,可以不顯示指定 _ai_as_ci會同時隱含_ai_cs會同時隱含_as。如:latin1_general_cilatin1_general_ai_ci是一樣的。
  • utf8mb4_0900_ai_ci 中的 0900:Unicode的字符集的Collation需要指定UCA(Unicode Collation Algorithm)版本號, 0900即是這個版本號;如果沒有指定,則會使用 version-4.0.0 UCA,如 utf8mb4_unicode_ci

MySQL Server的Charset和Collation

查看MySQL Server支持的Charset

有很多種方法可以查看當前MySQL Server支持的Character Set:

show character set; -- 方法1

show charset; -- 方法2

show char set; -- 方法3

select * from information_schema.character_sets; -- 方法 4

查看特定字符集信息(主要包含默認的Collation和MAXLEN):

show character set like 'utf%';; -- 方法1

show charset like 'utf%';; -- 方法2

show char set like 'utf%'; -- 方法3

select * from information_schema.character_sets 
where CHARACTER_SET_NAME like 'utf%'; -- 方法 4

查看MySQL Server支持的Collation

SHOW COLLATION WHERE Charset = 'utf8mb4';

或者

select * from INFORMATION_SCHEMA.COLLATIONS where CHARACTER_SET_NAME='utf8mb4';

查看MySQL Server當前的Charset和Collation

show variables like 'character_set_server';
show variables like 'collation_server';

或者使用語句:

select @@character_set_server, @@collation_server;

MySQL Server默認的Charset和Collation

MySQL官方文檔可查看默認的Charset和Collation:

  • <=5.7 doc MySQL Server 5.7或之前版本默認的Charset和Collation是: latin1latin1_swedish_ci
  • 8.x doc MySQL Server 8.x(當前版本)默認的Charset和Collation是: utf8mb4utf8mb4_0900_ai_ci

修改MySQL Server默認的Charset和Collation

修改默認值,需要重新編譯源碼。

cmake . -DDEFAULT_CHARSET=latin1

或者

cmake . -DDEFAULT_CHARSET=latin1 \
  -DDEFAULT_COLLATION=latin1_german1_ci

指定MySQL Server的Charset和Collation

可以在啟動MySQL Server的時候指定Server的Charset和Collation,下面三種方法是等效的:

mysqld # 默認的charset是utf8mb4, 而且 utf8mb4 默認的collation是 utf8mb4_0900_ai_ci

mysqld --character-set-server=utf8mb4

mysqld --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_0900_ai_ci

數據庫(Database)的Charset和Collation

創建數據庫的時候,如果沒有指定character setcollation,會自動用MySQL Server的 character setcollation

查看數據的Character Set和Collation

USE db_name;
SELECT @@character_set_database, @@collation_database;

不想改變當前數據庫的話,可以使用語句:

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';

指定或修改數據庫(Database)的Character Set和Collation

創建db時指定:

CREATE DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;

修改:

ALTER DATABASE db_name CHARACTER SET latin1 COLLATE latin1_swedish_ci;

表(Table)的Charset和Collation

如果創建表的時候沒有指定表級別Charset和Collation,會默認使用數據庫(Database)的Charset和Collation。

查看表(Table)的Charset和Collation

SELECT 
t.TABLE_SCHEMA,
t.table_name,
ccsa.* 
FROM 
information_schema.`TABLES` t,
information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` ccsa
WHERE ccsa.collation_name = t.table_collation
AND t.table_schema = "db_name"
AND t.table_name = "table_name";

指定或修改表(Table)的Character Set和Collation

CREATE TABLE tbl_name (column_list)
    [[DEFAULT] CHARACTER SET charset_name]
    [COLLATE collation_name]]

ALTER TABLE tbl_name
    [[DEFAULT] CHARACTER SET charset_name]
    [COLLATE collation_name]

列(Column)的Charset和Collation

如果創建表的時候沒有指定列的Charset和Collation,會默認使用表(Table)的Charset和Collation。

查看列(Column)的Charset和Collation

SELECT 
*
FROM information_schema.`COLUMNS`
WHERE table_schema = "db_name"
AND table_name = "table_name";

指定或修改列(Column)的Character Set和Collation

CREATE TABLE t1
(
    col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci
) CHARACTER SET latin1 COLLATE latin1_bin;

ALTER TABLE t1 MODIFY
    col1 VARCHAR(5)
      CHARACTER SET latin1
      COLLATE latin1_swedish_ci;

Connection Character Sets and Collations

Client和MySQL Server交互前,先建立連接(Connection)。

Client通過建立的connection發送SQL Statements(查詢、插入等操作)到MySQL Server;MySQL Server則通過建立的connection返回給Client相應的結果(SQL執行結果,或者錯誤信息)。

Client和Server建立連接並設置character set

  1. Client在建立連接的時候會指定collation (charset的默認collation);
  2. MySQL Server根據collation找到對應的charset;
  3. MySQL Server然后charset設置session變量: character_set_client, character_set_results, character_set_connectioncollation_connection被設置為指定charset的默認collation。

相關session變量

  • character_set_servercollation_server: MySQL Server的Character Set 和 Collation;
  • character_set_databasecollation_database:數據庫的Character Set 和 Collation;
  • character_set_client :MySQL Server使用此session變量的charset作為client 發送來的SQL Statements的charset;
  • character_set_connection: Server會把client發送的statements字符集從character_set_client轉為character_set_connection
  • collation_connection:這個對字符串常量的比較很重要;
  • character_set_results:Server返回給client的結果(column values, result metadata such as column names, and error messages)對應的字符集;

查看connection相關的session變量:

SHOW SESSION VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'collation\_%';

設置character set和collation

SET NAMES {'charset_name'
    [COLLATE 'collation_name'] | DEFAULT}

SET NAME 會設置三個session變量(session system variables)為指定的charset和collation:

  • character_set_client
  • character_set_connection
  • character_set_results
SET {CHARACTER SET | CHARSET}
    {'charset_name' | DEFAULT}

SET CHARACTER SET會設置 character_set_clientcharacter_set_results為指定的charset;

並把 character_set_connection 設置為 character_set_database 的charset。

參考文檔

  1. What is Collation and Character Set in MySQL?
  2. Character Sets, Collations, Unicode
  3. What does character set and collation mean exactly?
  4. MySQL Character Set
  5. MySQL Collation
  6. Connection Character Sets and Collations

原文:MySQL基礎知識:Character Set和Collation


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM