mysql 字符集:utf8和utf8mb4區別
結論: MySQL在5.5.3之後, utf8mb4 代替 utf8
一、簡介
MySQL在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容四位元組的unicode。好在utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換。當然,為了節省空間,一般情況下使用utf8也就夠了。
二、內容描述
那上面說了既然utf8能夠存下大部分中文漢字,那為什麼還要使用utf8mb4呢? 原來mysql支援的 utf8 編碼最大字元長度為 3 位元組,如果遇到 4 位元組的寬字元就會插入異常了。三個位元組的 UTF-8 最大能編碼的 Unicode 字元是 0xffff,也就是 Unicode 中的基本多文種平面(BMP)。也就是說,任何不在基本多文字平面的 Unicode字元,都無法使用 Mysql 的 utf8 字符集儲存。包括 Emoji 表情(Emoji 是一種特殊的 Unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 Unicode 字元等等。
三、問題根源
最初的 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。
引用批註
[1] 談談字符集與字元編碼
http://my.oschina.net/leejun2005/blog/232732#OSC_h3_4
[2] 關於 MySQL UTF8 編碼下生僻字元插入失敗/假死問題的分析
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1815205/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql中utf8和utf8mb4區別MySql
- MySQL中utf8和utf8mb4的區別MySql
- 談mysql中utf8和utf8mb4區別MySql
- mysql 修改字符集為utf8mb4MySql
- mysql 字符集 utf8 for solaris 10MySql
- 在MySQL中,不要使用“utf8”。使用“utf8mb4”MySql
- MySQL 5.7 版本的 UTF8 字符集調研MySql
- utf8改成utf8mb4實戰教程
- utf-8 和 utf8的區別小記
- utf8 和 UTF-8 在使用中的區別
- linux下設定mysql資料庫字符集utf8LinuxMySql資料庫
- mysql 字符集 latin1 轉換utf8血淚史 。MySql
- 關於移動裝置 表情符號的資料庫儲存 與 utf8 與utf8mb4 字符集符號資料庫
- MYSQL和SQL的區別MySql
- mysql中!=和is not的區別MySql
- mysql中“ ‘ “和 “ ` “的區別MySql
- MySQL和Oracle的區別MySqlOracle
- Oracle和MySQL的區別OracleMySql
- MySQL字符集設定及字元轉換(latin1轉utf8)MySql字元
- 各種字符集的區別
- mysql 資料型別,字符集MySQL 資料型別
- MySQL中CHAR和VARCHAR區別MySql
- 【轉】mysql 和 redis的區別MySqlRedis
- MS SQL Server和MySQL區別ServerMySql
- mysql字符集和字元排序MySql字元排序
- MYSQL5.5修改字符集報錯:unknown variable 'default-character-set=utf8'MySql
- python mysql utf8mb4PythonMySql
- oracle 字符集 AL32UTF8、UTF8Oracle
- SQLserver-MySQL的區別和用法ServerMySql
- mongodb和mysql有什麼區別MongoDBMySql
- Oracle 和 mysql的9點區別OracleMySql
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- 談談mysql和redis的區別MySqlRedis
- mysql 中set和enum的區別MySql
- MySQL中is not null和!=null和<>null的區別MySqlNull
- 更改Oracle字符集:把字符集ZHS16GBK換成UTF8Oracle
- Oracle 字符集從GBK升級到Utf8Oracle
- 【轉】 oracle 字符集 AL32UTF8、UTF8Oracle