二話不說,先來看一張圖html
想必這張圖你們在創建數據庫的時候都見到過,並且見到的時候可能對字符集還有一點熟悉,可是對這個排序規則不是很熟,不知道是幹嗎用的,我今天創建數據庫的時候也是這樣的,因而我就停了下來,搜了搜資料,把這個弄懂了。mysql
什麼是字符集?git
字符集就是字符的集合,例如熟知的有ASCII字符集、Unicode字符集、GB2312字符集,每一個字符集包含的字符個數是不一樣的,ASCII字符集包含了128字符,unicode字符集包含了1114112 個字符(目前只有少數使用,大部分仍是空閒的),GB2312包含了漢字6763個,文字符號682個。github
注意:GB2312字符集是不包含英文字符的,可是若是咱們要在GB2312字符集中使用英文字符怎麼辦呢,那好辦,若是在GB2312中找不到的字符,就會去ASCII字符集中去找。web
細心的同窗會發現,在mysql數據庫中,有着兩種類似的字符集,utf8和utf8mb4,那麼這兩種字符集是否是有什麼曖昧關係?同窗,我只能這麼說.........你這猜測是徹底正確滴!sql
傳說啊,在mysql5.3之前,只存在utf8,並且這個utf8和咱們日常所說的utf-8是有差異的,日常咱們所說的utf-8表示一個字符使用的字節數爲[1, 4]個字節,即[1, 4]個碼元,可是,數據庫裏面的utf8表示一個字符所使用的字節數爲[1, 3],三個字節只能表示unicode字符集中基本語言平面的字符,是不徹底的,因此千萬不要把數據庫中的utf8和utf-8編碼弄混了,要分清他們的區別。這時,一聲巨響,mysql5.3誕生了,而且還帶着utf8mb4字符集一塊兒誕生的,utf8mb4的出現徹底就是彌補utf8的缺陷,使其能夠表示出unicode字符集中的全部字符。數據庫
因此,推薦你們日常仍是使用utf8mb4吧,可能更好的兼容utf-8編碼。兼的死死的。segmentfault
你們對字符集或者編碼感興趣的能夠看看字符集與編碼這篇博客,講的很是的明瞭。centos
什麼又是排序規則呢?bash
排序規則就是按照特定的順序對字符進行排序,也供搜索使用,例如當咱們去數據庫中查詢表中的數據時,就會根據排序規則去查找,還有就是當咱們使用order by時,也是根據排序規則進行查找的。
每一種字符集對應了多種排序規則,且每一個排序規則只對應一種字符集,是一種典型的1對多的關係。
那麼接下來就得介紹一下排序規則都有哪些了。以utf8字符集舉例
- utf8_general_ci: 查詢時不區分大小寫匹配
- utf8_general_cs: 查詢時區分大小寫匹配
- utf8_bin: 字符串每一個字符串用二進制數據編譯存儲。 區分大小寫,並且能夠存二進制的內容,與utf8_general_cs同樣,區分大小寫
- utf8_unicode_ci : 和utf8_general_ci同樣,不區分大小寫
排序規則的命名是有約束的,開頭只能是對應字符集的名稱,中間是語言的名稱,最後是類型,ci表明的是case insensitive,即大小寫不敏感,cs表明的是case sensitive,即大小寫敏感的,英語棒棒噠!
更多排序規則你們能夠看這官方文檔
那麼大小寫敏不敏感在mysql中有啥區別呢?
例如如今是大小寫不敏感的,若是此時去查a,則會將A和a一塊兒查出來。
若是是大小寫敏感的,若是再去查a,則只會查出來a。
排序規則的基本定義說的差很少了,接下來就結合mysql進行實戰吧。
查詢mysql支持的字符集可使用一下命令
# 方式1
SHOW CHARACTER SET;
# 方式2
use information_schema;
select * from CHARACTER_SETS;
複製代碼
結果以下(部分結果)
上面結果中的latin一、latin2可能你們很陌生,可是說到另外一種字符集iso-8859-1你們可能非常熟悉,尤爲是搞web的童鞋,其實latin1就是iso-8859-1的別名,iso-8859系列一共有15個,iso-8859-n(n=1,2,3,4........16),其中不包括12,
每一種字符集都有一個默認的字符序,即上述的DEFAULT_COLLATE列。
若是查看mysql支持的字符序以及每種字符集默認的字符序呢?
# 第一種方式
show collation;
# 第二種方式
use information_schema;
select * from collations;
複製代碼
結果以下
能夠看到,圖中帶yes所對應的記錄就是前面字符集對應的默認字符序。
當咱們建立數據庫時候,若是沒有指定字符集和字符序,mysql就會使用默認的字符集以及字符序,也就是character_set_server
、collation_server
。如何查看這些信息呢?
SHOW VARIABLES;
複製代碼
取了其中一部分結果
如何修改這些配置呢?
方法一共有三種:
方法一 啓動服務時指定:
mysqld --character-set-server=latin1 \
--collation-server=latin1_swedish_ci
複製代碼
此種方法也能夠單獨指定字符集
方法二 配置文件指定:
centos7
中配置文件在/etc/my.cnf
或着/etc/mysql/my.cnf
進行一下修改
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
複製代碼
從新啓動mysql服務
systemctl restart mysqld
複製代碼
方法三 運行時修改:
SET character_set_server = utf8;
複製代碼
注意:此種方法知識暫時有效的,下次從新啓動mysql服務後,配置會被重置。
若是咱們在建立數據庫時想指定字符集以及編碼,該怎麼辦呢,圖形界面的操做我就不提了,我就說一說命令的方式
CREATE DATABASE db_name
[CHARACTER SET charset_name]
[COLLATE collation_name]
複製代碼
若是隻指定字符集,沒有指定字符序,那麼mysql就會使用此字符集默認的排序規則,若是隻指定了字符序,而沒有指定字符集,那麼mysql就會使用此字符序對應的字符集。
還有就是數據庫中表使用的字符集以及字符序,若是咱們在建立表的時候指定了字符集以及字符序,那麼此表就會使用指定的,若是沒有指定字符序或者字符集,那麼此表就會使用所屬數據庫的字符集以及字符序。
# 建立表示指定字符集以及字符序
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]
複製代碼
表中的列也是存在字符集以及字符序的,若是在建立列的時候指定了字符集以及字符序,那麼此列就會使用指定的,若是沒有指定,那麼就使用所屬表的字符集以及字符序。
# 建立列時指定字符集以及字符序
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
# 修改列的字符集以及字符序
ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;
複製代碼
一個mysql下,每一個庫可使用不一樣的字符集,每一個庫下的全部表也可使用不一樣的字符集,以及每一個表中列也可使用不一樣的字符集。
通常都是建立數據庫時候指定字符集,而後再建立表的時候以及建立列的時候都不會指定字符集以及字符序。
查看某個數據庫的字符集以及字符序
use test_schema;
SELECT @@character_set_database, @@collation_database;
複製代碼
查看錶的字符集以及字符序
SHOW TABLE STATUS;
複製代碼
首先須要選中某個數據庫,而後纔可執行
查看某一列的字符集以及字符序
SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA="test_schema" AND TABLE_NAME="test_table" AND COLUMN_NAME="char_column";
複製代碼