爲何不要在MySQL中使用UTF-8編碼方式

MySQL的UTF-8編碼方式

MySQL 從 4.1 版本開始支持 UTF-8,也就是 2003 年,然而目前流行的UTF-8 標準(RFC 3629)是在此以後規定的。正所以,才造就了MySQL中的UTF-8與咱們平常開發中的UTF-8不一致,從到致使了些問題。MySQL的UTF-8只支持每一個字符最多三個字節,而真正的 UTF-8 是每一個字符最多四個字節。java

問題復現

有數據庫表以下:utf8編碼方式數據庫

往數據庫存一條記錄:編碼

@Test
public void testInsert() {
    User user = new User();
    user.setUsername("\uD83D\uDE00 ");
    user.setPassword("123456");
    userRepo.save(user);
}
複製代碼

這裏只是部分代碼,看不懂不要緊,這裏是給user表插入一條記錄。其中username是\uD83D\uDE00 。spa

其實\uD83D\uDE00是一個emoji表情。code

由於MySQL中utf8字符集只支持三字節UTF-8編碼的Unicode範圍,而emoji字符屬於四字節編碼部分,因此程序運行預期是會報錯的。運行這段代碼:cdn

與預期一致,報錯了。blog

解決問題

雖然MySQL的UTF-8存在缺陷,可是MySQL(包括mariadb)官方卻沒有修復此bug,而是經過2010年從新發布的「utf8mb4」來支持真正的 UTF-8。所以想要解決此問題,只可以將MySQL數據庫設置爲utf8mb4字符集才行。開發

總結

這個問題,也是由於某次保存數據的時候保存了一個emoji表情才發現的。其實最先開始用MySQL的時候,就有發現一個utf8mb4了,可是本身卻沒有卻去了解UTF8和UTF8MB4的區別。經過這次教訓,之後使用MySQL就老老實實的設置字符集爲utf8mb4吧。string

相關文章
相關標籤/搜索