為什麼Mysql要設定用utf8mb4編碼 utf8mb4_unicode_ci

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 呢?gJ(F;ff%^$
原因為 mysql 支持的 utf8 編碼最大長度為 3 位元(Unicode 字符是0xffff)稱之Unicode 的基本多文種平面(BMP),但如果遇到 4 位元的寬字串就會插入異常了,也就是任何不在基本多文本平面的 Unicode 字串,都無法使用 Mysql 的 utf8 字串集儲存。

TG#ET$$^@:rr3
如果要開發討論區或是大型跨國網頁程式,為了擁有更加的文字兼容性,就可以使用 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; // 新
...
https://google.com.tw/webgolds.com

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)使用

回上一頁

相關文章:

喜歡這篇文章嗎?立即分享

Posted : / Views: 13815
Last updated :2017-11-01