日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

紧急通知!不要在MySQL中使用UTF-8编码!!!

發布時間:2025/3/16 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 紧急通知!不要在MySQL中使用UTF-8编码!!! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL是一種關系型數據庫,這個大家肯定都不陌生,使用MySQL創建數據庫的時候,大家需要指定一種編碼方式。

很多時候,大家基于自己對編碼方式的了解,會認為UTF-8是一種通用的編碼方式,所以大多數時候會默認選擇這種編碼方式。

但是,這往往會給你的數據庫埋下一個大坑!!!

MySQL對Unicode的支持

Unicode字符集,他現在已經是計算機科學領域里的一項業界標準,它對世界上大部分的文字系統進行了整理、編碼,使得計算機可以用更為簡單的方式來呈現和處理文字。

為了適應不同的數據存儲和傳遞需求,人們提出了 Unicode Transformation Format(UTF)系列編碼。這其中包含UTF-8、UTF-16、UTF-32等。

通過查閱MySQL官方文檔(https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html ),我們可以知道,在MySQL中,主要支持以下字符集:utf8、ucs2、utf8mb3、utf8mb4、utf16、utf16le和utf32

不同的字符集的區別在于包含的字符情況以及存儲需要的空間。

在MySQL官方文檔中,介紹了支持的編碼方式之后,還有一段醒目的提醒:

翻譯過來是:utf8mb3字符集已被棄用,它在未來的MySQL版本中將會被刪除,請使用utf8mb4代替。在目前的8.0版本中,utf8指的就是utf8mb3,雖然未來可能改成utf8mb4,但是為了避免產生歧義,可以考慮為字符集引用顯式指定utf8mb4,而不是utf8。

也就是說,當我們在MySQL 8.0 中指定字符編碼方式為UTF-8的時候,其實使用的是utf8mb3這種編碼方式。

那么,我們先來說說utf8mb3。

utf8mb3

utf8mb3字符集是MySQL早期就支持的字符集,他具有以下特征:

1、僅支持BMP字符(不支持補充字符)

2、每個多字節字符最多需要三個字節

注意,僅支持BMP字符,那么什么是BMP字符呢?

BMP是Basic Multilingual Plane的縮寫,即碼位在0到65535之間(或者U+0000和U+FFFF)的字符。

BMP中并不包含補充字符,即碼位在U+10000和U+10FFFF之間的的字符。補充字符有哪些呢,如一些生僻的漢字,或者Emoji 表情等都是補充字符。

也就是說,如果在建表的時候,指定的編碼方式是utf8mb3(utf-8),那么對于一些生僻字或者emoji表情都無法表示。

utf8mb4

早期的時候,Unicode 只用到了 0~0xFFFF 范圍的數字編碼,這就是 BMP 字符集。所以,最初MySQL在設計之初,也就只涉及了包含BMP 字符集的utfmb3(utf-8),但是隨著文字越來越多,3個字節肯定無法全部表示,于是Unicode支持的字符就更多了。

所以,早期的utfmb3在有些場景中就不能滿足需求了,于是,MySQL在5.5.3之后增加了utf8mb4的編碼。

utfmb4字符集具有以下特征:

1、支持BMP和補充字符。

2、每個多字節字符最多需要4個字節。

utf8mb4與utf8mb3字符集不同,utf8mb3字符集只支持BMP字符,每個字符最多使用三個字節:

對于BMP字符,utf8mb4和utf8mb3具有相同的存儲特征,即相同的編碼值,相同的編碼,相同的長度。

對于補充字符,utf8mb4需要4個字節來存儲它,而utf8mb3根本不能存儲該字符。所以我們說utf8mb4是utf8mb3的超集。

所以,很多時候,為了考慮到兼容性,建議創建MySQL表的時候,使用utf8mb4,而不是utf8!

utf8mb3和utf8mb4區別及優缺點

前面分別介紹了utf8mb3和utf8mb4字符集,他們的區別如下:

utf8mb3只支持BMP (Basic Multilingual Plane)的字符。utf8mb4還支持BMP之外的補充字符。

utf8mb3每個字符最多使用3個字節。Utf8mb4每個字符最多使用4個字節。

utf8mb4比utf8mb3來說,他能表示更多的補充字符,但是同時占用的空間可能會更大一些。

從utf8mb3轉換成utf8mb4

首先,想要把字符集從utf8mb3轉換到utf8mb4,其實是問題不大的:

對于BMP字符,utf8mb4和utf8mb3具有相同的存儲特征:相同的編碼值,相同的編碼,相同的長度。

對于補充字符,utf8mb4需要4個字節來存儲它,而utf8mb3根本不能存儲該字符。當將utf8mb3列轉換為utf8mb4時,您不必擔心轉換補充字符,因為沒有補充字符。

假設有一張已知表使用了utf8mb3:

CREATE?TABLE?t1?(col1?CHAR(10)?CHARACTER?SET?utf8?COLLATE?utf8_unicode_ci?NOT?NULL,col2?CHAR(10)?CHARACTER?SET?utf8?COLLATE?utf8_bin?NOT?NULL )?CHARACTER?SET?utf8;

下面的語句將t1轉換為utf8mb4:

ALTER?TABLE?t1DEFAULT?CHARACTER?SET?utf8mb4,MODIFY?col1?CHAR(10)CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_unicode_ci?NOT?NULL,MODIFY?col2?CHAR(10)CHARACTER?SET?utf8mb4?COLLATE?utf8mb4_bin?NOT?NULL;

往期推薦

我面試幾乎必問:你設計索引的原則是什么?怎么避免索引失效?

8年開發,連登陸接口都寫這么爛...

2021年,薪酬最高的5種編程語言

?

直面Java第360期:如何使用樂觀鎖提升高并發的吞吐率并且不會超賣

深入并發第015期:多線程代碼如何Debug?

如果你喜歡本文,

請長按二維碼,關注?Hollis.

轉發至朋友圈,是對我最大的支持。

點個?在看?

喜歡是一種感覺

在看是一種支持

↘↘↘

總結

以上是生活随笔為你收集整理的紧急通知!不要在MySQL中使用UTF-8编码!!!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。