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

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

  1. 首先建立一張臨時用表:

create TEMPORARY table medivac(
          name VARCHAR(10)
     ); CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  1. 插入一些數據:

    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)
  2. 查看錶中數據:

    mysql> select * from medivac
        -> ;
    +--------------------------------+
    | name                           |
    +--------------------------------+
    | a                              |
    | 哈                             |
    | ?                               |
    | 哈哈哈哈哈哈哈哈哈哈           |
    +--------------------------------+
  3. 查看佔用字節數:

    +--------------+
    | 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.co... MySQL Temporary Tables

https://ruby-china.org/topics... MySQL 數據庫 varchar 到底能夠存多少個漢字,多少個英文呢?咱們來搞搞清楚

相關文章
相關標籤/搜索