全面瞭解mysql中utf8和utf8mb4的區別

2022-07-08 06:25:21 字數 5738 閱讀 1559

1樓:匿名使用者

utf8 是 mysql 中的一種字符集,只支援最長三個位元組的 utf-8字元,也就是 unicode 中的基本多文字平面。

mysql 中的 utf8 為什麼只支援持最長三個位元組的 utf-8字元呢?我想了一下,可能是因為 mysql 剛開始開發那會,unicode 還沒有輔助平面這一說呢。那時候,unicode 委員會還做著 「65535 個字元足夠全世界用了」的美夢。

mysql 中的字串長度算的是字元數而非位元組數,對於 char 資料型別來說,需要為字串保留足夠的長。當使用 utf8 字符集時,需要保留的長度就是 utf8 最長字元長度乘以字串長度,所以這裡理所當然的限制了 utf8 最大長度為 3,比如 char(100) mysql 會保留 300位元組長度。至於後續的版本為什麼不對 4 位元組長度的 utf-8 字元提供支援,我想一個是為了向後相容性的考慮,還有就是基本多文種平面之外的字元確實很少用到。

要在 mysql 中儲存 4 位元組長度的 utf-8 字元,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以後的才支援(檢視版本:

select version();)。我覺得,為了獲取更好的相容性,應該總是使用 utf8mb4 而非 utf8. 對於 char 型別資料,utf8mb4 會多消耗一些空間,根據 mysql 官方建議,使用 varchar 替代 char。

2樓:匿名使用者

最初的 utf-8 格式使用一至六個位元組,最大能編碼 31 位字元。最新的 utf-8 規範只使用一到四個位元組,最大能編碼21位,正好能夠表示所有的 17個 unicode 平面。

utf8 是 mysql 中的一種字符集,只支援最長三個位元組的 utf-8字元,也就是 unicode 中的基本多文字平面。

mysql 中的 utf8 為什麼只支援持最長三個位元組的 utf-8字元呢?我想了一下,可能是因為 mysql 剛開始開發那會,unicode 還沒有輔助平面這一說呢。那時候,unicode 委員會還做著 「65535 個字元足夠全世界用了」的美夢。

mysql 中的字串長度算的是字元數而非位元組數,對於 char 資料型別來說,需要為字串保留足夠的長。當使用 utf8 字符集時,需要保留的長度就是 utf8 最長字元長度乘以字串長度,所以這裡理所當然的限制了 utf8 最大長度為 3,比如 char(100) mysql 會保留 300位元組長度。至於後續的版本為什麼不對 4 位元組長度的 utf-8 字元提供支援,我想一個是為了向後相容性的考慮,還有就是基本多文種平面之外的字元確實很少用到。

要在 mysql 中儲存 4 位元組長度的 utf-8 字元,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以後的才支援(檢視版本:

select version();)。我覺得,為了獲取更好的相容性,應該總是使用 utf8mb4 而非 utf8. 對於 char 型別資料,utf8mb4 會多消耗一些空間,根據 mysql 官方建議,使用 varchar 替代 char。

全面瞭解mysql中utf8和utf8mb4的區別

3樓:蛋炒飯第二餐

主要是utf8mb4字符集 單元位元組數要比utf8大

全面瞭解mysql中utf8和utf8mb4的區別

4樓:愛可生雲資料庫

整理 mysql 8.0 文件時發現一個變更:

預設字符集由 latin1 變為 utf8mb4。想起以前整理過字符集轉換文件,升級到 mysql 8.0 後大概率會有字符集轉換的需求,在此正好分享一下。

當時的需求背景是:

部分系統使用的字符集是 utf8,但 utf8 最多隻能存 3 位元組長度的字元,不能存放 4 位元組的生僻字或者表情符號,因此打算遷移到 utf8mb4。

遷移方案一1. 準備新的資料庫例項,修改以下引數:[mysqld]## character settingsinit_connect='set names utf8mb4'#連線建立時執行設定的語句,對super許可權使用者無效character-set-server = utf8mb4collation-server = utf8mb4_general_ci#設定服務端校驗規則,如果字串需要區分大小寫,設定為utf8mb4_binskip-character-set-client-handshake#忽略應用連線自己設定的字元編碼,保持與全域性設定一致## innodb settingsinnodb_file_format = barracudainnodb_file_format_max = barracudainnodb_file_per_table = 1innodb_large_prefix = on#允許索引的最大位元組數為3072(不開啟則最大為767位元組,對於類似varchar(255)欄位的索引會有問題,因為255*4大於767)

2. 停止應用,觀察,確認不再有資料寫入

可通過 show master status 觀察 gtid 或者 binlog position,沒有變化則沒有寫入。

3. 匯出資料

先匯出表結構:mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=off --databases testdb > /backup/testdb.sql

後匯出資料:mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=off --database testdb > /backup/testdata.sql

4. 修改建表語句

修改匯出的表結構檔案,將表、列定義中的 utf8 改為 utf8mb4

5. 匯入資料

先匯入表結構:mysql -u -p testdb < /backup/testdb.sql

後匯入資料:mysql -u -p testdb < /backup/testdata.sql

6. 建使用者

查出舊環境的資料庫使用者,在新資料庫中建立

7. 修改新資料庫埠,啟動應用進行測試

關閉舊資料庫,修改新資料庫埠重啟,啟動應用

**mysql中utf8和utf8mb4的區別

5樓:tutu天然呆

一、區別

1、mysql在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容四位元組的unicode。

2、好在utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換。當然,為了節省空間,一般情況下使用utf8也就夠了。

二、內容描述

1、那上面說了既然utf8能夠存下大部分中文漢字,那為什麼還要使用utf8mb4呢? 原來mysql支援的 utf8 編碼最大字元長度為 3 位元組,如果遇到 4 位元組的寬字元就會插入異常了。

2、三個位元組的 utf-8 最大能編碼的 unicode 字元是 0xffff,也就是 unicode 中的基本多文種平面(bmp)。

3、也就是說,任何不在基本多文字平面的 unicode字元,都無法使用 mysql 的 utf8 字符集儲存。

4、包括 emoji 表情(emoji 是一種特殊的 unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 unicode 字元等等。

三、問題根源

1、最初的 utf-8 格式使用一至六個位元組,最大能編碼 31 位字元。最新的 utf-8 規範只使用一到四個位元組,最大能編碼21位,正好能夠表示所有的 17個 unicode 平面。

2、utf8 是 mysql 中的一種字符集,只支援最長三個位元組的 utf-8字元,也就是 unicode 中的基本多文字平面。

3、mysql 中的 utf8 為什麼只支援持最長三個位元組的 utf-8字元呢?可能是因為 mysql 剛開始開發那會,unicode 還沒有輔助平面這一說呢。

4、那時候,unicode 委員會還做著 「65535 個字元足夠全世界用了」的美夢。mysql 中的字串長度算的是字元數而非位元組數,對於 char 資料型別來說,需要為字串保留足夠的長。

5、當使用 utf8 字符集時,需要保留的長度就是 utf8 最長字元長度乘以字串長度,所以這裡理所當然的限制了 utf8 最大長度為 3,比如 char(100) mysql 會保留 300位元組長度。

6、至於後續的版本為什麼不對 4 位元組長度的 utf-8 字元提供支援,我想一個是為了向後相容性的考慮,還有就是基本多文種平面之外的字元確實很少用到。

7、要在 mysql 中儲存 4 位元組長度的 utf-8 字元,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以後的才支援(檢視版本:

select version();)。

8、為了獲取更好的相容性,應該總是使用 utf8mb4 而非 utf8. 對於 char 型別資料,utf8mb4 會多消耗一些空間,根據 mysql 官方建議,使用 varchar 替代 char。

6樓:匿名使用者

一、什麼是utf8mb4

我們在使用phpmyadmin管理面板時,可以在首頁看到名為「server connection collation」(伺服器連線排序規則)的選項,用來選擇所使用的字符集。對於我們常用的utf8,卻有utf8和utf8mb4兩種,這是為什麼呢?

原來,mysql在5.5.3版本之後增加了這個utf8mb4的編碼,mb4就是most bytes

4的意思,專門用來相容四位元組的unicode。其實,utf8mb4是utf8的超集,理論上原來使用utf8,然後將字符集修改為utf8mb4,也

會不會對已有的utf8編碼讀取產生任何問題。當然,為了節省空間,一般情況下使用utf8也就夠了。

二、為什麼會有utf8mb4

既然utf8應付日常使用完全沒有問題,那為什麼還要使用utf8mb4呢? 低版本的mysql支援的utf8編碼,最大字元長度為 3

位元組,如果遇到 4 位元組的字元就會出現錯誤了。三個位元組的 utf-8 最大能編碼的 unicode 字元是 0xffff,也就是 unicode

中的基本多文平面(bmp)。也就是說,任何不在基本多文平面的 unicode字元,都無法使用mysql原有的 utf8

字符集儲存。這些不在bmp中的字元包括哪些呢?最常見的就是emoji 表情(emoji 是一種特殊的 unicode 編碼,常見於 ios 和

android 手機上),和一些不常用的漢字,以及任何新增的 unicode 字元等等。

三、擴充套件閱讀:utf-8編碼

理論上將, utf-8 格式使用一至六個位元組,最大能編碼 31 位字元。最新的 utf-8 規範只使用一到四個位元組,最大能編碼21位,正好能夠表示所有的 17個 unicode 平面。關於utf編碼,請閱讀《常見編碼總結》一文。

而utf8 則是 mysql 早期版本中支援的一種字符集,只支援最長三個位元組的 utf-8字元,也就是 unicode 中的基本多文字平面。這可能是因為在mysql釋出初期,基本多文種平面之外的字元確實很少用到。而在mysql5.

5.3版本後,要在 mysql 中儲存 4 位元組長度的 utf-8 字元,就可以使用 utf8mb4 字符集了。例如可以用utf8mb4字元編碼直接儲存emoj表情,而不是存表情的替換字元。

為了獲取更好的相容性,應該總是使用 utf8mb4 而非 utf8,事實上,最新版的phpmyadmin預設字符集就是utf8mb4。誠然,對於 char 型別資料,使用utf8mb4 儲存會多消耗一些空間。

mysql中自增值無法使用

sqlstr insert into user userid,username,password,privilege values jim 123 0 修改為 sqlstr insert into user username,password,privilege values jim 123 0 m...

如何才能全面的瞭解人的過往全部人生

全面的瞭解一個人的過往全部人生,想真正瞭解一個人,著實不容易。正所謂 朋友千千萬,真正知己有幾何?不過,觀察一個人,全面的瞭解一個人的過往全部人生,不能看他或她對你怎樣好。要觀察他或她對別人的態度。即可判斷這個人的大體本質。全面的瞭解一個人的過往全部人生,以貌取人,夲無可非異,一樣的作用,還是順眼的...

RTA中的左溢全面,RTA中的左溢全面資料

姓名 左溢 城市 上海徐彙區 英文名 jerry zuo 網名 小小少年 zy97120 出生日期 1997.2.26 這是陽曆 星座 水瓶座 身高 182cm 在長 學校 上海市第二初級中學 東二小學 暱稱 小左 小溢 左老師 溢寶 左少 最愛的書 隋唐演義 特長 唱歌 英文歌曲 籃球 理想 有好...