utf8 跟 utf8mb4 具有相同的儲存特性:

相同的代碼值,相同的編碼,相同的長度。

 

不過 utf8mb4 擴展到一個字符最多可有 4位元,所以能支持更多的位元集。

utf8mb4 不只兼容 utf8 ,還能比 utf8 能顯示更多的字串。將編碼改為 utf8mb4 外不需要做其他轉換。

 

 

前言

為了要跟國際接軌,原本的 utf8 編碼在儲存某些國家的文字(或是罕見字)已經不敷使用,因此在 mysql 5.5.3 版以上,可

以開始使用 4-Byte UTF-8 Unicode 的編碼方式。

 

Tips:

MYSQL查看版本方式: select version();

 

 

utf8 多了 mb4 有甚麼好處

MySQL 在 5.5.3 版本之後增加了 utf8mb4 字符編碼,mb4即most bytes 4。

簡單說 utf8mb4 是 utf8 的超集並完全兼容 utf8,能夠用四個字元儲存更多的字符。

* utf8 跟 utf8mb4 具有相同的儲存特性:相同的代碼值,相同的編碼,相同的長度。

* 不過使用 utf8mb4 可以讓1個字符最多可有 4 位元,所以能支持更多的位元集。

* utf8mb4 可以向下兼容 utf8,而且比 utf8 可以表示更多的字串。此外,將編碼改為 utf8mb4 外不需要做其他轉換。

 

utf8 已經能夠存下大部分的中文字,那為什麼還要改成使用 utf8mb4 呢?

原因為 mysql 支持的 utf8 編碼最大長度為 3 位元(Unicode 字符是0xffff)稱之Unicode 的基本多文種平面(BMP),但如

果遇到 4 位元的寬字串就會插入異常了,也就是任何不在基本多文本平面的 Unicode 字串,都無法使用 Mysql 的 utf8 字

串集儲存。

 

如果要開發討論區或是大型跨國網頁程式,為了擁有更加的文字兼容性,就可以使用 utf8mb4。

然而,在 CHAR 類型數據,utf8mb4 會比 utf8 多消耗一些空間,故 Mysql 官方指出,可使用 VARCHAR 替代 CHAR。

 

最後,到底要用 utf8mb4_general_ci 還是 utf8mb4_unicode_ci 呢?

 

建議使用:utf8mb4_unicode_ci

 

這兩種排序規則都是為 UTF-8 字符編碼。

utf8mb4_unicode_ci 使用標準的 Unicode Collation Algorithm(UCA),utf8mb4_general_ci 比

utf8mb4_unicode_ci 速度要來得快,但是 utf8mb4_unicode_ci 比 utf8mb4_general_ci 要來得精確。

像是 "ß",若是以 utf8mb4_general_ci 運作,會轉成 "s", 而utf8mb4_unicode_ci 則是會轉成 "ss"。

 

 

utf8mb4_general_ci V.S. utf8mb4_unicode_ci

utf8mb4 兼容 utf8,且比 utf8 能表示更多的字串,utf8mb4_unicode_ci 在對文字排序上會比 utf8mb4_general_ci

更精準,utf8mb4_general_ci 是一種簡易化的排序規則,這個規則會把一些相似文字的定義成同一層排序,所以文字排序

上無法像 utf8mb4_unicode_ci 這麼精準。因此 utf8mb4_unicode_ci 比較精準。

 

例如有一些拉丁字母 "ÀÁÅåāă" ,在 utf8mb4_general_ci 的排序規則下,是等同於英文字母 "A"。

而 utf8mb4_unicode_ci 還有區分 A, a, À, å。

 

 

效能

utf8mb4_general_ci 的效能會比 utf8mb4_unicode_ci 好一些,不過影響的效能很小,很難感受出差別,除非真的很在

意這種微小的效能差異,否則建議直接使用 utf8mb4_unicode_ci 就可以了。

 

 

適用範圍

當資料庫需要儲存或處理以下資料:

* 人名

* 罕見字地名

* 大型跨國網頁程式

* emoji (手機端常用的表情字符)

 

 

轉換成 utf8mb4_unicode_ci / 程式碼調整

看完已經迫不急待了,該如何進行轉換呢?

當連線到 MySQL 時候,程式(PHP)該怎麼設定呢?

1、連線時把 SET names utf8; 改成 SET names utf8mb4;

2、mysqldump 另外加上 --default-character-set=utf8mb4 ,可避免罕見字匯出錯誤。

 

 

MySQL 建立新資料庫時,直接把編碼設定成 utf8mb4_unicode_ci 的方式:

CREATE DATABASE `google_webgolds` /*!40100 COLLATE 'utf8mb4_unicode_ci' */;

 

Mysql連線設定:

//SET names utf8;// 舊

SET names utf8mb4;// 新

...

 

PHP 中連線 MYSQL 方式:

... $dsn = 'mysql:host=example.com;dbname=testdb;port=3306;charset=utf8mb4';

 

 

常見錯誤

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=';

<<Unknown error>>: 1644 ERROR 1267 (HY000): Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '=' in

 

utf8_unicode_ci V.S. utf8_general_ci

 

utf8mb4_general_ci V.S. utf8mb4_unicode_ci

 

萬國碼(UTF-8)使用

 

 

Reference:http://blog.webgolds.com/view/232

Reference:http://seanlook.com/2016/10/23/mysql-utf8mb4/

Reference:http://ourmysql.com/archives/1402

文章標籤

全站熱搜

mitblog 發表在 痞客邦 留言(1) 人氣()