MySql 5.5 以前,UTF8 編碼只支持1-3個字節,只支持BMP這部分的unicode編碼區,BMP是從哪到哪?
戳這裏 基本就是 0000 ~ FFFF 這一區。mysql
從MySQL 5.5 開始,可支持4個字節UTF編碼utf8mb4,一個字符最多能有4字節,因此能支持更多的字符集。sql
utf8mb4 is a superset of utf8數據庫
tf8mb4兼容utf8,且比utf8能表示更多的字符。ruby
至於何時用,看你作的什麼項目了。。。
在作移動應用時,會遇到IOS用戶在文本的區域輸入emoji表情,若是不作必定處理,就會致使插入數據庫異常。編碼
MySql 5.0 以上的版本:code
一、一個漢字佔多少長度與編碼有關:htm
UTF-8:一個漢字 = 3個字節,英文是一個字節
GBK: 一個漢字 = 2個字節,英文是一個字節
二、varchar(n) 表示n個字符,不管漢字和英文,MySql都能存入 n 個字符,僅實際字節長度有所區別。ci
三、MySQL檢查長度,可用SQL語言 SELECT LENGTH(fieldname) FROM tablename 這個命令能夠看到各行使用的字節數。unicode
mysql版本5.6.32-78.0下面用實際例子來講明問題:get
首先建立一張臨時用表:
create TEMPORARY table medivac( name VARCHAR(10) ); CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
插入一些數據:
INSERT INTO medivac (name) VALUES ('' at line 1 mysql> INSERT INTO medivac (name) VALUES ('a'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO medivac (name) VALUES ('哈'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO medivac (name) VALUES ('\U+1F604'); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO medivac (name) VALUES ('哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈'); Query OK, 1 row affected, 1 warning (0.00 sec)
查看錶中數據:
mysql> select * from medivac -> ; +--------------------------------+ | name | +--------------------------------+ | a | | 哈 | | ? | | 哈哈哈哈哈哈哈哈哈哈 | +--------------------------------+
查看佔用字節數:
+--------------+ | length(name) | +--------------+ | 1 | | 3 | | 4 | | 30 | +--------------+
沒什麼好說的 一目瞭然,注意,若是存儲超過字段規定的最大字符數,後面存儲的東西會被無視,而且曝出一個warning。詳見過程2的信息。
總結:
一個varchar存漢字須要使用三個字段在utf8和utf8mb4編碼表的狀況下。
若是須要存儲emoji表情的需求,新表的默認編碼方式應該寫爲utf8mb4。另外提一點在最新發布的mysql8.0裏面,默認編碼方式已是utf8mb4了。
在utf8和utf8mb4中 varchar(n)這個n是字符,所見即所得,一個a是一個字符一個?也是一個字符 不過就是a這個字符是1個字節 哈這個字符是3個字節 而?這個字符是4個字節表示罷了
Reference:
https://www.tutorialspoint.co... MySQL Temporary Tables
https://ruby-china.org/topics... MySQL 數據庫 varchar 到底能夠存多少個漢字,多少個英文呢?咱們來搞搞清楚