mysql 編碼和漢字存儲占用字節問題的探索


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 到底可以存多少個漢字,多少個英文呢?我們來搞搞清楚


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM