utf8mb4 編碼使用的一些紀錄

因為有個資料庫需要處理人名跟地名的罕見字,原本的 utf8 不敷使用,所以開使用 utf8mb4 來處理

在 my.cnf 加入了下面設定

[client]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[code]
default-character-set=utf8mb4


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

預期會有特殊字元的欄位也會都改成 utf8mb4_unicode_ci ,但因為 utf8mb4 佔用空間實在太多,所以沒有全面使用這個編碼,希望能減少一點資源消耗(不過沒有仔細比較差異就是了)

這時候也發現 phpmyadmin 3.4.x 沒辦法從設定去變更編碼,因此需要修改 libraries/database_interface.lib.php 裡面的編碼, 4.x 不確定是否需要改,但位置會變成 libraries\DatabaseInterface.class.php

因為還不是很熟練,所以轉入轉出時經常會遇到罕見字消失問題(變成問號),有時候是連線編碼設定錯誤造成罕見字變成問號(但實際資料沒有問題), mysqldump 則是得加上 --default-character-set=utf8mb4 避免罕見字錯誤

沒有很深入了解問題的根源,只是先有個簡單的紀錄

評論

  • edited 十月 2014
    ;)) utf-8 是屬於 1~6 byte 這個說看起來~好像mysql只支援3byte以下!這個又只支援4byte??那5,6byte有支援嗎? 好神奇~真的無法理解設計者怎麼會弄出這樣的東西~

    另外一個疑問是 utf-8是動態的1~6編碼~所以你說資料比較多?難道他並不是utf-8而是特殊的utf-8相容規範?
  • http://stackoverflow.com/questions/11533448

    這篇說得還蠻清楚的, utf32 與 utf8mb4 才是標準的 unicode ,差異在 utf32 固定 4 bytes ,而 utf8mb4 則是彈性使用 1~4 bytes ,所以空間的部份應該是我的誤會。

    原本的 utf8 只有涵蓋 1~3 bytes ,所以只有 65536 字,遇到罕見字就會出狀況

    也有提到 utf16 ,在前面 65536 字使用 2 bytes ,其他則是固定使用 4 bytes

    你提到的 5, 6bytes 部份有來源嗎?目前看起來最大就 4 bytes
  • http://zh.wikipedia.org/wiki/UTF-8
    關鍵字 UTF-8的特性 下方有說明!


    RFC定義的~所以最大是到6BYTE
    https://www.ietf.org/rfc/rfc2279.txt


  • http://stackoverflow.com/questions/9533258

    這篇提到 RFC3629 是 4 bytes ,看起來 RFC3629 已經取代 RFC2279 了? MySQL 是依據 RFC3629 實做的( http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-utf8.html )
  • #-o 真的~ RFC3629 內有說廢棄並且替換掉RFC2279 ,難怪我看一些 open source內有的寫拆到6 byte,有的拆到4 byte(mb string 就是了),還一直以為支援比較多的是正確的,原來2003年就重新定義了。
  • [code]
    default-character-set=utf8mb4

    my.cnf 裡面設定 'code' option group 是影響那些東西?
    mysql document 我找不到相關的敘述...
Sign In or Register to comment.