MySql 5.5 之前,UTF8 編碼只支持1-3個字節,只支持BMP這部分的unicode編碼區,BMP是從哪到哪?
基本就是 0000 ~ FFFF 這一區。
從MySQL 5.5 開始,可支持4個字節UTF編碼utf8mb4,一個字符最多能有4字節,所以能支持更多的字符集。
utf8mb4 is a superset of utf8
tf8mb4兼容utf8,且比utf8能表示更多的字符。
至於什么時候用,看你做的什么項目了。。。
在做移動應用時,會遇到IOS用戶在文本的區域輸入emoji表情,如果不做一定處理,就會導致插入數據庫異常。
MySql 5.0 以上的版本:
1、一個漢字占多少長度與編碼有關:
UTF-8:一個漢字 = 3個字節,英文是一個字節
GBK: 一個漢字 = 2個字節,英文是一個字節
2、varchar(n) 表示n個字符,無論漢字和英文,MySql都能存入 n 個字符,僅實際字節長度有所區別。
3、MySQL檢查長度,可用SQL語言 SELECT LENGTH(fieldname) FROM tablename 這個命令可以看到各行使用的字節數。
mysql版本5.6.32-78.0下面用實際例子來說明問題:
1. 首先創建一張臨時用表:
create TEMPORARY table medivac( name VARCHAR(10) ); CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
2. 插入一些數據:
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)
3. 查看表中數據:
mysql> select * from medivac -> ; +--------------------------------+ | name | +--------------------------------+ | a | | 哈 | | 😄 | | 哈哈哈哈哈哈哈哈哈哈 | +--------------------------------+
4. 查看占用字節數:
+--------------+ | length(name) | +--------------+ | 1 | | 3 | | 4 | | 30 | +--------------+
沒什么好說的 一目了然,注意,如果存儲超過字段規定的最大字符數,后面存儲的東西會被無視,並且曝出一個warning。詳見過程2的信息。
總結:
1. 一個varchar存漢字需要使用三個字段在utf8和utf8mb4編碼表的情況下。
2. 如果需要存儲emoji表情的需求,新表的默認編碼方式應該寫為utf8mb4。另外提一點在最新發布的mysql8.0里面,默認編碼方式已經是utf8mb4了。
3. 在utf8和utf8mb4中 varchar(n)這個n是字符,所見即所得,一個a是一個字符一個😄也是一個字符 不過就是a這個字符是1個字節 哈這個字符是3個字節 而😄這個字符是4個字節表示罷了
Reference:
https://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm MySQL Temporary Tables
https://ruby-china.org/topics/24920 MySQL 數據庫 varchar 到底可以存多少個漢字,多少個英文呢?我們來搞搞清楚
