MySQL默認的字符編碼為utf8,修改為utf8mb4后可支持emoji表情。
utf8mb4解決了MySQL數據庫存儲emoji表情的問題。utf8mb4是utf8的超集,理論上由utf8升級到utf8mb4字符編碼沒有任何兼容問題。
升級utf8到utf8mb4前先備份
1、備份所有需要升級的數據庫,如果是虛機最好做快照。
2、查看mysql版本是否高於5.5.3。
3、查看當前系統默認的字符集設置
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; +--------------------------+-----------------+ | Variable_name | Value | +--------------------------+-----------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | +--------------------------+-----------------+ 10 rows in set (0.01 sec) mysql>
4、查看database的字符編碼
#polarsnow 為庫名;
mysql> show create database polarsnow; +-----------+--------------------------------------------------------------------+ | Database | Create Database | +-----------+--------------------------------------------------------------------+ | polarsnow | CREATE DATABASE `polarsnow` /*!40100 DEFAULT CHARACTER SET utf8 */ | +-----------+--------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
5、查看table的字符編碼
mysql> show create table ps; +-------+---------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------+ | ps | CREATE TABLE `ps` ( `name` varchar(100) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+---------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
6、查看column的字符編碼
mysql> show full columns from ps; +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ | name | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | | +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ 1 row in set (0.00 sec)
修改:
修改database默認的字符集:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
mysql> ALTER DATABASE polarsnow CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; Query OK, 1 row affected (0.03 sec) mysql> show create database polarsnow; +-----------+--------------------------------------------------------------------------------------------------+ | Database | Create Database | +-----------+--------------------------------------------------------------------------------------------------+ | polarsnow | CREATE DATABASE `polarsnow` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ | +-----------+--------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show tables; +---------------------+ | Tables_in_polarsnow | +---------------------+ | ps | +---------------------+ 1 row in set (0.00 sec) mysql> show create table ps; +-------+---------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------+ | ps | CREATE TABLE `ps` ( `name` varchar(100) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+---------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show full columns from ps; +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ | name | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | | +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ 1 row in set (0.00 sec) mysql> create table test_tb2 (tb2 varchar(100) ); Query OK, 0 rows affected (0.21 sec) mysql> show tables; +---------------------+ | Tables_in_polarsnow | +---------------------+ | ps | | test_tb2 | +---------------------+ 2 rows in set (0.00 sec) mysql> show create table test_tb2; +----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ | test_tb2 | CREATE TABLE `test_tb2` ( `tb2` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | +----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql>
修改table的字符集
1、只修改表默認的字符集:
ALTER TABLE table_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2、修改表默認的字符集和所有字符列的字符集:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql> show create table ps; +-------+---------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+---------------------------------------------------------------------------------------------+ | ps | CREATE TABLE `ps` ( `name` varchar(100) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +-------+---------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show full columns from ps; +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ | name | varchar(100) | utf8_general_ci | YES | | NULL | | select,insert,update,references | | +-------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+ 1 row in set (0.00 sec) mysql> ALTER TABLE ps CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Query OK, 0 rows affected (0.38 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table ps; +-------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------+ | ps | CREATE TABLE `ps` ( `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci | +-------+------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> show full columns from ps; +-------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment | +-------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ | name | varchar(100) | utf8mb4_unicode_ci | YES | | NULL | | select,insert,update,references | | +-------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+ 1 row in set (0.00 sec) mysql>
3、修改column默認的字符集
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
檢查字段的最大長度和索引列
- 字段長度
由於從utf8升級到了utf8mb4,一個字符所占用的空間也由3個字節增長到4個字節,但是我們當初創建表時,設置的字段類型以及最大的長度沒有改變。例如,你在utf8下設置某一字段的類型為TINYTEXT
, 這中字段類型最大可以容納255字節,三個字節一個字符的情況下可以容納85個字符,四個字節一個字符的情況下只能容納63個字符,如果原表中的這個字段的值有一個或多個超過了63個字符,那么轉換成utf8mb4字符編碼時將轉換失敗,你必須先將TINYTEXT
更改為TEXT
等更高容量的類型之后才能繼續轉換字符編碼
- 索引
在InnoDB引擎中,最大的索引長度為767字節,三個字節一個字符的情況下,索引列的字符長度最大可以達到255,四個字節一個字符的情況下,索引的字符長度最大只能到191。如果你已經存在的表中的索引列的類型為VARCHAR(255)
那么轉換utf8mb4時同樣會轉換失敗。你需要先將VARCHAR(255)
更改為VARCHAR(191)
才能繼續轉換字符編碼
修改配置文件

修改 vim /etc/my.cnf # 對本地的mysql客戶端的配置 [client] default-character-set = utf8mb4 # 對其他遠程連接的mysql客戶端的配置 [mysql] default-character-set = utf8mb4 # 本地mysql服務的配置 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci > service mysqld restart
檢查修改:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; +--------------------------+--------------------+ | Variable_name | Value | +--------------------------+--------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ 10 rows in set (0.00 sec)
修復&優化所有數據表
> mysqlcheck -u root -p --auto-repair --optimize --all-databases
參考文檔:
https://docs.lvrui.io/2016/08/21/%E4%BF%AE%E6%94%B9MySQL%E7%9A%84%E5%AD%97%E7%AC%A6%E9%9B%86%E4%B8%BAutf8mb4/