一.常用字符編碼
1.ASCII編碼
用一個字節表示一個字符
2.ANSI編碼
每個國家為了顯示本國的語言而對ASCII碼進行了拓展
用兩個字節表示一個漢字,中國的ANSI編碼是GB2312編碼(簡體),日本的ANSI編碼是JIS編碼,臺灣的ANSI編碼是BIG5編碼(繁體)
3.GBK編碼
對GB2312進行的擴展,用來顯示罕見的、古漢語的漢字。
4.Unicode編碼
用四字節表示一個字符
5.UTF-8編碼
國際通用字符庫,涵蓋了地球上人類的所有的語言文字
可以識別字符,如果字符是簡單的字母,就用一字節存儲,如果是復雜的生僻字,就用四字節存儲
utf8不支持表情符號emoji,utf8mb4支持表情符號emoji
二.字符編碼全局設置
1.原因
用戶在向網站服務端進行數據信息存儲時,由于數據庫服務系統默認的字符編碼設置問題,可能會導致出現字符亂碼,為了能更準確地識別數據庫中的中文字符信息,需要對數據庫服務配置文件中的默認字符編碼設置進行調整
2.顯示所有可用的字符集
show charset;
3.查詢 MySQL 中所有包含“char”關鍵字的系統變量(通常是與字符集和字符編碼相關的系統變量)
show variables like '%char%';
注意這些是否是一樣的
4.在/etc目錄將數據庫服務配置文件進行備份
cp my.cnf my.cnf.bak
5.修改配置文件
vim /etc/my.cnf
在[mysqld]區域寫入
character-set-server=gbk
6.重啟以重新加載配置文件
?systemctl restart mysqld
7.再次查看
show variables like '%char%';
8.查看新創建的數據庫的字符集
show databases;
create database yong65535;
show create database yong65535;
9.編輯修改客戶配置文件參數信息
client.cnf是客戶端配置文件信息
vim /etc/my.cnf
在[client]區域內寫入
default-character-set=gbk
10.重啟和查看
systemctl restart mysqld
show variables like '%char%';
或
show variables like 'character_set_%';
11.最后修改回去
vim /etc/my.cnf
三.字符編碼局部設置
1.指定某一數據庫的字符集
在創建庫時指定字符集就行了
如創建qwq數據庫,指定字符集為gbk
create database qwq charset gbk;
查看該數據庫信息
show create database qwq;
2.指定數據庫中某一個表的字符集
在創建表時指定字符集就可以了
先進入qwq數據庫
use qwq;
3.查看新創建的表優先使用默認全局的字符集還是優先使用這一數據庫的字符集
創建t1表,該表有表項id,數據類型為int
create table t1(id int);
查t1表信息
show create table t1;
?
由此可見優先繼承的是數據庫的字符集
4.創建t2表,該表有表項id類型為int,且指定使用的字符集為utf8mb4;
create table t2(id int) charset utf8mb4;
查看表t2內容
show create table t2;
四.參數信息、解釋說明及其關系圖
1.參數信息及其解釋說明
character_set_client:用來設置客戶端默認使用的字符集
character_set_connection:用來設置連接數據庫時默認的字符集
character_set_database:用來設置創建數據庫默認的編碼格式
character_set_filesystem:文件系統的編碼格式,把操作系統上的文件名轉化成此字符集,即把character_set_client轉換character_set_filesystem,默認binary是不做任何轉換
character_set_results:數據庫給客戶端返回時默認使用的編碼格式
character_set_server:服務器安裝時指定的默認編碼格式,這個變量建議由系統管理,不要認為定義
character_set_system:數據庫系統使用的編碼格式,這個值一直是utf8,不需要設置,它是存儲系統元數據的編碼格式
character_sets_dir:這個變量是字符集安裝的目錄
2.關系圖
舉例說明:
SET character_set_client = gbk;
SET character_set_connection = utf8mb4;
SET character_set_results = latin1;
內部操作字符集=utf8mb4
過程:
客戶端字符串(中文)?
? ?--用gbk編碼--> 字節流(gbk)
? ? ? ?↓
服務器用character_set_client=gbk解碼成字符
? ? ? ?↓
服務器用character_set_connection=utf8mb4編碼字符用于SQL執行
? ? ? ?↓
插入時轉為表字符集utf8mb4編碼寫入磁盤
? ? ? ?↓
查詢時從磁盤取utf8mb4字節流
? ? ? ?↓
轉成字符序列
? ? ? ?↓
根據character_set_results=latin1編碼成latin1字節流返回客戶端
? ? ? ?↓
客戶端用latin1解碼成字符顯示
3.注意事項
客戶端字符集設置要和服務器對應,避免字符集不匹配導致亂碼,一般建議客戶端、連接、結果、表字段都統一用utf8mb4,以減少字符集轉換復雜度和亂碼風險
五.編碼排序(校對)規則
根據設置的排序規則不同,查詢信息時,影像數據信息的查詢輸出和排序效果
1.所有已用的字符排序規則
?show collation;
2.排序規則后綴及其解釋
后綴 | 含義及解釋 |
---|---|
_ci | Case Insensitive(不區分大小寫) |
字符比較時忽略大小寫,‘a’與‘A’視為相同。是最常用的后綴。 | |
_cs | Case Sensitive(區分大小寫) |
字符比較時區分大小寫,‘a’和‘A’被視為不同字符。 | |
_bin | Binary(二進制) |
按照字符的二進制值(ASCII碼或Unicode碼)逐字節比較,區分大小寫且不考慮語言規則。速度快,精確比較。 | |
_ai | Accent Insensitive(不區分重音符號) |
忽略字符的重音符號(例如é和e視為相同),通常和ci結合使用,如utf8mb4_0900_ai_ci 。 | |
_as | Accent Sensitive(區分重音符號) |
區分帶重音符號和不帶重音符號的字符。 | |
0900 | 代表使用Unicode Collation Algorithm版本 9.0.0的排序規則。 |
比如utf8mb4_0900_ai_ci ,這是MySQL 8.0及以后版本引入的新排序規則,支持更準確的Unicode排序。 |
3.對庫設置校對規則
在創建數據庫時指定
create database qoq charset utf8 collate utf8_general_mysql500_ci;
查看這個數據庫信息
show create database qoq;
4.對表設置校對規則
create table t1?(id int) charset utf8 collate utf8_german2_ci;
5.演示校對規則不同的效果
創建三個表,有表項info,char(3)類型,utf8mb4編碼,排序規則各不相同
區分大小寫
CREATE TABLE t3 (info CHAR(3)) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
不區分大小寫
CREATE TABLE t4 (info CHAR(3)) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_as_cs;
ascii碼存儲
CREATE TABLE t5 (info CHAR(3)) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
向三個表插入相同的數據
insert into t3 values('a'),('A'),('b'),('B'),('c'),('C');
insert into t4 values('a'),('A'),('b'),('B'),('c'),('C');
insert into t5 values('a'),('A'),('b'),('B'),('c'),('C');
查詢數據信息
select * from t3?where info='a';
select * from t4?where info='a';
select * from t5?where info='a';
排序處理
select * from t3 order by info;
select * from t4?order by info;
select * from t5?order by info;
校對規則還會影響數據排序結果,因此也成為排序規則
六.修改數據庫的字符集
1.直接轉換,此方法只會影響之后存儲的數據,不會修改之前存儲的數據
查看當前的字符集
show create table t1;
修改成utf8mb4,之后再次查看
alter table t1 charset utf8mb4;
show create table t1;
2.間接修改
鎖表邏輯(別讓用戶再寫數據了)導出數據(例如:mysqldump),重新創建數據空表(設定目標字符集),導入備份數據信息
可以影響之后存儲的數據,也可以影響之前的數據
注意必須保證修改之后的數據字符集是之前字符集的超集