Mysql字符集utf8和utf8mb4詳解
背景
1、MySQL在5.5.3版本之后增加了utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來(lái)兼容四字節(jié)的unicode;
2、utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉(zhuǎn)換。當(dāng)然,為了節(jié)省空間,一般情況下使用utf8也就夠了;
名詞解釋
- 字符集(character set/charset):字符的二進(jìn)制編碼方式;
- UTF-8:是unicode的實(shí)現(xiàn)方式之一,其他實(shí)現(xiàn)方式還有utf-16,utf-32,它是一種變長(zhǎng)的編碼,一個(gè)符號(hào)使用1~4個(gè)字節(jié)表示;
- utf8:mysql中實(shí)現(xiàn)了utf-8編碼的unicode字符集,是utf8mb3的別稱,utf8編碼中一個(gè)符號(hào)使用1~3個(gè)字節(jié)表示;
- utf8mb4:mysql中實(shí)現(xiàn)了
關(guān)系
- 1、都實(shí)現(xiàn)了utf-8編碼中的的unicode字符集;
- 2、utf8僅支持基本多語(yǔ)言平面Basic Multilingual Plane (BMP);
- 3、utf8mb4支持BMP之外的補(bǔ)充字符,如一些生僻的漢字,emoji字符,以及任何新增的unicode字符。
- 4、utf8一個(gè)字符最多使用3個(gè)字節(jié)存儲(chǔ),utf8mb4一個(gè)字符最多使用4個(gè)字節(jié)存儲(chǔ);
- 5、對(duì)于BPM字符,utf8和utf8mb4都使用三個(gè)字節(jié)存儲(chǔ);對(duì)于非BMP字符,utf8mb4使用4個(gè)字節(jié)存儲(chǔ),utf8不能存儲(chǔ)非BMP字符;
- 6、InnoDB中默認(rèn)最大可對(duì)767個(gè)字節(jié)建立索引;使用utf8的列最多可對(duì)255個(gè)字符建立索引;使用utf8mb4的最多可對(duì)191個(gè)字符建立索引;
實(shí)踐
為了驗(yàn)證上面的理論,創(chuàng)建如下兩個(gè)表:它們的字符集分別為utf8和utf8mb4
CREATE TABLE `test_utf8` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(5) NOT NULL COMMENT '名稱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='測(cè)試utf8'; CREATE TABLE `test_utf8mb4` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` varchar(5) NOT NULL COMMENT '名稱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='測(cè)試utf8mb4';
向兩個(gè)表中分別插入如下數(shù)據(jù):
insert into test_utf8(name) values ('我是一顆小'), ('我是reo'), ('12345'), ('ggvdc'); insert into test_utf8mb4(name) values ('我是一顆小'), ('我是reo'), ('12345'), ('ggvdc'); insert into test_utf8mb4(name) values ('?????');
查看在兩種字符集下的存儲(chǔ)長(zhǎng)度:
該圖驗(yàn)證了上面3、4、5點(diǎn)理論;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何通過Mysql的二進(jìn)制日志恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù)
本篇文章主要介紹了詳解如何通過Mysql的二進(jìn)制日志恢復(fù)數(shù)據(jù)庫(kù)數(shù)據(jù),具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04MySQL?SQL性能分析之慢查詢?nèi)罩?、explain使用詳解
這篇文章主要介紹了MySQL?SQL性能分析?慢查詢?nèi)罩?、explain使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04mysql把一段數(shù)據(jù)變成一個(gè)臨時(shí)表
這篇文章主要介紹了mysql把一段數(shù)據(jù)變成一個(gè)臨時(shí)表,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02mysql中取系統(tǒng)當(dāng)前時(shí)間,當(dāng)前日期方便查詢判定的代碼
今天在寫一段查詢語(yǔ)句的時(shí)候,需要判定結(jié)束日期是不是大于當(dāng)前日期,一般情況下都是通過php判定日期,然后查詢。2011-12-12