1. 程式人生 > 資料庫 >MySQL 編碼utf8 與 utf8mb4 utf8mb4_unicode_ci 與 utf8mb4_general_ci

MySQL 編碼utf8 與 utf8mb4 utf8mb4_unicode_ci 與 utf8mb4_general_ci

參考:mysql字符集小結

utf8mb4 已成為 MySQL 8.0 的預設字符集,在MySQL 8.0.1及更高版本中將 utf8mb4_0900_ai_ci 作為預設排序規則。

新專案只考慮 utf8mb4

UTF-8 編碼是一種變長的編碼機制,可以用1~4個位元組儲存字元。

因為歷史遺留問題,MySQL 中的 utf8 編碼並不是真正的 UTF-8,而是閹割版的,最長只有3個位元組。當遇到佔4個位元組的 UTF-8 編碼,例如 emoji 字元或者複雜的漢字,會導致儲存異常。

從 5.5.3 開始,MySQL 開始用 utf8mb4 編碼來實現完整的 UTF-8,其中 mb4 表示 most bytes 4,最多佔用4個位元組。從 8.0 之後,將會在某個版本開始用 utf8mb4 作為預設字元編碼。

設定伺服器預設字符集為 utf8mb4

建立資料庫時,如果沒有指定字符集,會採用伺服器的預設字符集。設定伺服器預設字符集為 utf8mb4 可以提高便利性。

編輯 MySQL 的配置檔案

只需要關心5個系統變數,這5個都改為 utf8mb4 則修改成功:
character_set_client
character_set_connection
character_set_results
character_set_server
character_set_database

my.cnf 是MySQL 的配置檔案,修改之前記得先備份:

vi /etc/my.cnf

在[mysqld]下面加上default-character-set=utf8後伺服器啟動不了,莫名其妙。後來這麼改就好了(MySQL5.7):

[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci' 
init_connect='SET NAMES utf8mb4' 
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci 
skip-character-set-client-handshake
...
[client]
default-character-set=utf8mb4

MySQL8.0 預設已經是 utf8mb4,不用改懂。如果你要改的話,配置檔案如下:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server = utf8mb4
[client]
default-character-set=utf8mb4

重啟並確認

可以看到,系統編碼、連線編碼、伺服器和客戶端編碼都設定為 UTF-8了:

mysql> show variables like "%char%";
+--------------------------------------+--------------------------------+
| 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              |
| character_sets_dir          | /usr/share/mysql-8.0/charsets/ |
| validate_password.special_char_count | 1               |
+--------------------------------------+--------------------------------+
9 rows in set (0.00 sec)

MySQL 中字符集相關變數

character_set_client:客戶端請求資料的字符集
character_set_connection:從客戶端接收到資料,然後傳輸的字符集
character_set_database:預設資料庫的字符集,無論預設資料庫如何改變,都是這個字符集;如果沒有預設資料庫,那就使用 character_set_server指定的字符集,這個變數建議由系統自己管理,不要人為定義。
character_set_filesystem:把作業系統上的檔名轉化成此字符集,即把 character_set_client轉換character_set_filesystem, 預設binary是不做任何轉換的
character_set_results:結果集的字符集
character_set_server:資料庫伺服器的預設字符集
character_set_system:儲存系統元資料的字符集,總是 utf8,不需要設定

建立資料庫時指定字符集為 utf8mb4

如果資料庫預設字符集不是 utf8mb4,那麼可以在建立資料庫時指定字符集:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

排序字符集 collation

字元除了需要儲存,還需要排序或比較大小。推薦用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也沒啥問題。

MySQL 8.0 預設的是 utf8mb4_0900_ai_ci,屬於 utf8mb4_unicode_ci 中的一種,具體含義如下:

  • uft8mb4 表示用 UTF-8 編碼方案,每個字元最多佔4個位元組。
  • 0900 指的是 Unicode 校對演算法版本。(Unicode歸類演算法是用於比較符合Unicode標準要求的兩個Unicode字串的方法)。
  • ai指的是口音不敏感。也就是說,排序時e,è,é,ê和ë之間沒有區別。
  • ci表示不區分大小寫。也就是說,排序時p和P之間沒有區別。

utf8mb4 已成為預設字符集,在MySQL 8.0.1及更高版本中將utf8mb4_0900_ai_ci作為預設排序規則。以前,utf8mb4_general_ci是預設排序規則。由於utf8mb4_0900_ai_ci排序規則現在是預設排序規則,因此預設情況下新表格可以儲存基本多語言平面之外的字元。現在可以預設儲存表情符號。如果需要重音靈敏度和區分大小寫,則可以使用utf8mb4_0900_as_cs代替。

總結

到此這篇關於MySQL 編碼utf8 與 utf8mb4 utf8mb4_unicode_ci 與 utf8mb4_general_ci的文章就介紹到這了,更多相關mysql 編碼 utf8 與 utf8mb4內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!