為什麼 mysql 要額外加入乙個 utf8mb4 資料型別,而不是原地公升級 utf8?

時間 2021-05-06 02:11:34

1樓:

理論上是可以原地公升級的。

但是在商業用途中,這樣的公升級會帶來多大的影響是未知的,更何況萬一有哪個比較糟糕的東西依賴這個屬性。所以選擇新建乙個資料型別而不是原地公升級。

2樓:Ivony

其實我理解提問者的疑問在於,明明最長四位的UTF-8是之前最長三位的UTF-8的超集,也就是可以完全向下相容,為什麼不能就地公升級呢?

這裡面有個問題就是,即便是原有功能的擴充套件,有時候也可能是一種破壞性更新。

儘管並不知道這是不是MySQL選擇這個的原因。但是utf8和utf8mb4的行為就是會不一樣的。譬如說原有的utb8對於不支援的字元儲存報錯,那麼你就地公升級到utf8mb4他就不會報錯了,這也是行為的變化,萬一有些SB就是依賴這個報錯呢

這也是Windows必須保留各種系統元件的歷史版本的原因之一……

3樓:啃泥周公子

1. 原版utf8標準的字元是位元組變長的

2. 變長utf8在儲存形態上不利於做檢索,所以mysql把它做成定長的儲存(3個位元組)

3. 本來3位元組的utf8已經可以覆蓋這個世界上的所有語言,直到emoji等符號的出現,讓字符集大大擴充套件,導致utf8開始出現一些四位元組的符號

4.mysql又不能改原來的標準(否則在各種領域都會有相容性的問題),只能把這種定長四位元組的utf8當作一種新的字符集來處理,叫做utf8mb4

4樓:Weasley Frank

我沒記錯的話mysql的utf8實現是錯的,直接導致以前用mysql的utf8的人,把mysql的utf8當成了最多3位元組處理……

5樓:大寬寬

MySQL為什麼在這個地方犯2。以下內容僅僅為一種猜測。

先說一下utf8的標準,早期是用1~6個byte來表示乙個字元。所以最早的MySQL實現,乙個Char是用6個Bytes去實現的。這是正確的做法。

但是MySQL為了效能,希望使用者使用等長度的字元列。也就是說,乙個字元如果用不到6個byte,儲存裡就會被填充空白符號。學過計算機的人都會明白等長字元,用陣列的索引值去找到資料會非常快。

早期的RFC2279規定乙個UTF8字元被編碼為1~6個byte。後來才改成了1~4個。

為此,MySQL甚至搞過乙個「static-format「的儲存結構,就是用定長資料來加速資料訪問。(但這個東西只能用在MyISAM上,那時候MySQL還沒收InnoDB)

15.2.3.1 Static (Fixed-Length) Table Characteristics

但也很容易看出來,這麼幹實在是太浪費空間了。絕大部分的英文用utf8編碼1個byte就搞定了,中文等字元是3個byte。在1Charater = 6Byte的設計裡,再加上2023年初時儲存並不便宜,誰看了都會心疼。

好,基礎講完,再說歷史。讓我們回到2023年。MySQL計畫在4.

1版本支援utf8。4.1的早期開發版本用最多6個byte表示乙個utf8字元,這是對的。

但是MySQL不知道腦子裡抽了哪根筋,在2023年9月27日,for no particular reason,搞出這麼乙個commit,強制讓utf8編碼只能處理最多3個byte的序列。

See:UTF8 now works with up to 3 byte sequences only · mysql/mysql-server@43a506c

但大致猜測就是,MySQL當時又想用定長的儲存,又覺得太浪費,乾脆一鼓作氣,把6改成了3。

在Unicode中,3個Byte可以支援所有的BMP(basic multi-lingual plane)的字元;但是無法支援SMP(supplementary multi-lingual plane),包括emoji(這是重災區),一些生僻的CJK字元,一部分生僻的符號等。對於主要的文字(英文、歐洲各種語種、中文、日文……),3個byte的utf8也算是夠用。

但是,多年之後,也許是蘋果強力推emoji,大家才發現MySQL的utf8其實並不那麼utf8。直到2023年,MySQL的5.5.

3版本的時候,才引入了utf8mb4(從此刻開始,utf8是「utf8mb3「的alias)。這個change非常的不起眼,在更新總體介紹時壓根就沒提,只在明細裡寫了一行。也許是因為6改3這個變更實在太過於傻缺,不想張揚?

見:https://

本題問為啥不把utf8原地公升級,這個非常容易理解。大量的資料庫檔案已經按照了utf8的格式儲存。如果「原地公升級」也就意味著,所有已經存在的資料庫檔案都要重建。

資料這個東西~都懂得。如果MySQL真的這麼幹了,估計就不是會被罵,而是會直接被判死刑。用utf8mb4的形式慢慢過渡也算是可以理解的做法。

順便說一句。UTF8早期的標準RFC2279規定乙個UTF8字元是1~6個Byte。這也是為什麼早期Mysql把乙個UTF8字元設計為6個Byte的原因。

但是2023年11月,出了新的標準RFC3629,規定乙個UTF8字元是1~4個Byte,就比MySQL做出那個很傻的commit晚了一年。歷史真的很有趣。

從2023年到2023年,已經17年過去了,MySQL 8.0剛剛GA不久,但是utf8依然是utf8mb3的別名。不知道什麼時候這個在乙個莫名其妙的決策下誕生的奇行種才會被完全乾掉。

哎~摘自MySQL8.0的文件

6樓:wy Lament

因為他的utf8跟別人的utf8不太一樣。

後來搞了個跟別人一樣的,但是utf8已經用過了,只好叫utf8mb4utf-xx說白了是編碼方式。 現在長度都不一樣了,當然不能直接原地公升級。

比如會放不下啦,encode出來的東西跟之前不一樣啦,decode出來也不一樣啦,索引會炸什麼的 。

當然是做個新的出來,並提供轉換教程,然後按照業內慣例拖個幾年之後要麼變成feature,要麼宣布拋棄。

只吃早餐額外加半小時運動乙個月能瘦20斤 30斤嗎?

初心 不容易吧這個不吃飯身體需要的營養也跟不上都不能是個健康的身體怎麼瘦而是容易得胃病我以前也節過食乙個小姐姐告訴我這些我現在80斤以前160高,120斤 Angelina曉琳 如果你能堅持下來,應該還是有可能的。一天吃一頓屬於斷食了,如果卡路里攝入控制住,不吃高油高糖的食物,健康飲食,這個計畫還是...

英文本身是拼音文字,為什麼還要額外創造乙個音標系統?能否將單詞和發音統一而不喪失文字的準確性?

adipu 奇葩。本來是語言學的學生,由於涉及研究各種語言,需要準確予以標音,然後才需要學習國際音標的。國際音標本來就是方便為各種語言標音而設計的。而英語本身的字母和字母組合標音功能弱化,不得不借助國際音標這個高大上的語言學工具來大材小用,真的是奇葩。 runner time 英文本身是拼音文字,為...

為什麼 Apple 不加入任何乙個無線充電技術聯盟?

邢益濤 看了前面的回答,真是打臉 今年2月蘋果加入了wpc,手機很可能已經在做qi測試了。國內做技術的的確缺乏國際產業布局的眼光,難怪到現在還沒有在消費類市場上引導標準的能力。 微鵝 余峰 蘋果申請的無線充電專利的技術核心是近場磁共振。也就是和A4WP組織定義的rezence本質相同。當然以蘋果的尿...