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_ci
和latin1_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是:
latin1
和latin1_swedish_ci
- 8.x doc MySQL Server 8.x(當前版本)默認的Charset和Collation是:
utf8mb4
和utf8mb4_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 set
和 collation
,會自動用MySQL Server的 character set
和collation
。
查看數據的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
- Client在建立連接的時候會指定collation (charset的默認collation);
- MySQL Server根據collation找到對應的charset;
- MySQL Server然后charset設置session變量:
character_set_client
,character_set_results
,character_set_connection
,collation_connection
被設置為指定charset的默認collation。
相關session變量
character_set_server
和collation_server
: MySQL Server的Character Set 和 Collation;character_set_database
和collation_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_client
和 character_set_results
為指定的charset;
並把 character_set_connection
設置為 character_set_database
的charset。