mysql系列_Mysql系列(三)—— Mysql字符集和比较规则
一、前言
字符集表示的是存儲的二進(jìn)制與字符如何映射的關(guān)系,比較規(guī)則指的是字符如何排序的規(guī)則,比如字符如果使用order by到底按什么規(guī)則進(jìn)行排序。
二、查看命令
查看支持的字符集命令是:SHOW (CHARACTER SET|CHARSET) [LIKE 匹配的模式],CHARACTER SET|CHARSET同意,兩者都可以用。
查看支持的比較規(guī)則命令是:SHOW COLLATION [LIKE 匹配的模式]。
注意,比較規(guī)則的命名方式有一定規(guī)律,一般來說,滿足:
比較規(guī)則名稱以與其關(guān)聯(lián)的字符集的名稱開頭
后邊緊跟著該比較規(guī)則主要作用于哪種語言,比如utf8_polish_ci表示以波蘭語的規(guī)則比較,utf8_spanish_ci是以西班牙語的規(guī)則比較,utf8_general_ci是一種通用的比較規(guī)則。
名稱后綴意味著該比較規(guī)則是否區(qū)分語言中的重音、大小寫啥的,具體可以用的值如下:
后綴
英文釋義
描述
_ai
accent insensitive
不區(qū)分重音
_as
accent sensitive
區(qū)分重音
_ci
case insensitive
不區(qū)分大小寫
_cs
case sensitive
區(qū)分大小寫
_bin
binary
以二進(jìn)制方式比較
比如我們常用的utf8_general_ci這個(gè)比較規(guī)則是以ci結(jié)尾的,說明不區(qū)分大小寫進(jìn)行比較。
三、關(guān)于utf8與utfmb4
utf8和utfmb4是我們常用的字符集,這兩者有什么區(qū)別勒?實(shí)際上真正的UTF-8 是1-4個(gè)字節(jié),但是mysql里面的utf8不是指的這個(gè),而是指的utf8mb3,其中mb表示的是最多占用多少個(gè)字節(jié),mysql最開始為了節(jié)省空間資源偷偷把utf-8給閹割了,用1-3個(gè)字節(jié)表示,實(shí)際上1-3個(gè)字節(jié)也足夠表示我們平常使用的字符了。而實(shí)際上utfmb4才是真正的utf8,能映射所有的unicode碼。
四、字符集和比較規(guī)則的級別
MySQL有4個(gè)級別的字符集和比較規(guī)則,包括服務(wù)器級別、數(shù)據(jù)庫級別、表級別、列級別,對于一個(gè)表的列,這幾個(gè)級別粒度越具體的越優(yōu)先使用,在創(chuàng)建數(shù)據(jù)庫、表、列的時(shí)候,如果沒有具體指定用什么字符集和比較規(guī)則,自動(dòng)引用上一級別的配置。我們接下來看看各個(gè)級別的字符集和比較規(guī)則具體怎么設(shè)置。
服務(wù)器級別
系統(tǒng)變量
描述
character_set_server
服務(wù)器級別的字符集
collation_server
服務(wù)器級別的比較規(guī)則
如圖,服務(wù)器級別的字符集和比較規(guī)則由系統(tǒng)變量character_set_server和collation_server控制,查看和修改命令上一篇文章介紹過。我們可以通過啟動(dòng)選項(xiàng)、配置文件、運(yùn)行時(shí)更改來設(shè)置它。
數(shù)據(jù)庫級別
數(shù)據(jù)庫級別的字符集和比較規(guī)則的系統(tǒng)變量為:
系統(tǒng)變量
描述
character_set_database
當(dāng)前數(shù)據(jù)庫的字符集
collation_database
當(dāng)前數(shù)據(jù)庫的比較規(guī)則
如果想查看當(dāng)前數(shù)據(jù)庫使用的字符集和比較規(guī)則,可以使用以上的變量值進(jìn)行查看(前提是使用USE語句選擇當(dāng)前默認(rèn)數(shù)據(jù)庫,如果沒有默認(rèn)數(shù)據(jù)庫,則變量與相應(yīng)的服務(wù)器級系統(tǒng)變量具有相同的值)。
另外,這兩個(gè)變量是只讀的,我們不能直接修改這兩個(gè)值就把數(shù)據(jù)庫的字符集和比較規(guī)則改變了。這兩個(gè)值只能通過DDL語句去改變。語法格式為:
CREATE DATABASE 數(shù)據(jù)庫名
[[DEFAULT] CHARACTER SET 字符集名稱]
[[DEFAULT] COLLATE 比較規(guī)則名稱];
ALTER DATABASE 數(shù)據(jù)庫名
[[DEFAULT] CHARACTER SET 字符集名稱]
[[DEFAULT] COLLATE 比較規(guī)則名稱];
表級別
編輯和修改:
`` CREATE TABLE 表名 (列的信息) [[DEFAULT] CHARACTER SET 字符集名稱] [COLLATE 比較規(guī)則名稱]]
ALTER TABLE 表名 [[DEFAULT] CHARACTER SET 字符集名稱] [COLLATE 比較規(guī)則名稱] ``
列級別
編輯和修改:
CREATE TABLE 表名(
列名 字符串類型 [CHARACTER SET 字符集名稱] [COLLATE 比較規(guī)則名稱],
其他列...
);
ALTER TABLE 表名 MODIFY 列名 字符串類型 [CHARACTER SET 字符集名稱] [COLLATE 比較規(guī)則名稱];
另外
由于字符集和比較規(guī)則是互相有聯(lián)系的,如果我們只修改字符集,則比較規(guī)則將變?yōu)樾薷暮蟮淖址J(rèn)的比較規(guī)則。,只修改比較規(guī)則,則字符集將變?yōu)樾薷暮蟮谋容^規(guī)則對應(yīng)的字符集。
五、Mysql中字符集的轉(zhuǎn)換
我們知道從客戶端發(fā)往服務(wù)器的請求本質(zhì)上就是一個(gè)字符串,服務(wù)器向客戶端返回的結(jié)果本質(zhì)上也是一個(gè)字符串,而字符串其實(shí)是使用某種字符集編碼的二進(jìn)制數(shù)據(jù)。這個(gè)字符串可不是使用一種字符集的編碼方式一條道走到黑的,從發(fā)送請求到返回結(jié)果這個(gè)過程中伴隨著多次字符集的轉(zhuǎn)換,在這個(gè)過程中會用到3個(gè)系統(tǒng)變量:
系統(tǒng)變量
描述
character_set_client
服務(wù)器解碼請求時(shí)使用的字符集
character_set_connection
服務(wù)器處理請求時(shí)會把請求字符串從character_set_client轉(zhuǎn)為character_set_connection
character_set_results
服務(wù)器向客戶端返回?cái)?shù)據(jù)時(shí)使用的字符集
多次轉(zhuǎn)碼流程如上圖,注意,如果某個(gè)列使用的字符集和character_set_connection代表的字符集不一致的話,還需要進(jìn)行一次字符集轉(zhuǎn)換。一般情況下要使用保持這三個(gè)變量的值和客戶端使用的字符集相同,免得不必要的編解碼開銷。
總結(jié)
以上是生活随笔為你收集整理的mysql系列_Mysql系列(三)—— Mysql字符集和比较规则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 防火墙 ftp,RedHat
- 下一篇: redis缓存原理与实现_基于Redis