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
留言列表