unicode定义了1,114,112个字符,0hex to 10FFFFhex ,共17个Plane
第一个Plane为0x0--- 0xFFFF ,一共65536个字符,包括了最常用的字符 (其中包括中日韩的常用字符) 称之为 Basic Multilingual Plane or BMP 需要注意的是mysql的utf8字符集也只实现了这个Plane,所以mysql里面字段设置为utf8的话,只能存储0x0--- 0xFFFF这个代码点范围内的字符,比如emoji表情就不在这个范围。略坑
那剩余的16个Plane就称之为 supplementary planes or astral planes
5.5.3以上的mysql支持utf8mb4,这个字符集完全向下兼容utf8,但是他的存储范围覆盖了整个unicode的定义范围,即0x000000-0x10FFFF.
utf8是unicode编码方案的一种存储实现,他兼容acsii字符集,但是也正是因为这种兼容导致存储汉字等多字符编码的时候需要浪费一些位来表示额外信息。
- 如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。(可表示的unicode代码点范围为0x0-0x7f)
- 如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(5个bit)代表在Unicode中的序号。且第二个字节以10开头(可用6个bit,加上第一个字节可以是引用的5,一共可用是11位 可表示的unicode代码点范围为0x80-0x7FF)
- 如果一个字节以1110开头,那么代表当前字符为三字节字符,占用3个字节的空间。1110之后的所有部分(4个bit)代表在Unicode中的序号。且第二、第三个字节以10开头(第二个第三个字节的可使用位都只有6,加上第一个字节可以使用的为为4 一共为6+6+4=16为,可表示的unicode代码点范围为0x800-0xFFFF)这3部分就是unicode的第一个Plane ,也就是BMP,mysql的utf8字符集也只支持上面这3部分,所以mysql的utf8字符集的一个字符最多使用3个字节进行存储
- 如果一个字节以10开头,那么代表当前字节为多字节字符的非首位字节。10之后的所有部分(6个bit)代表在Unicode中的序号。
- 如果一个字节以11110开头,那么代表当前字符为四字节字符,占用4个字节的空间。11110之后的所有部分(3个bit)代表在Unicode中的序号。且第二、第三、第四个字节以10开头(可表示的unicode代码点范围为0x10000-0x10FFFF) 这个范围就是 supplementary planes or astral planes
参考:https://zh.wikipedia.org/wiki/UTF-8
https://zh.wikipedia.org/wiki/Unicode
https://en.wikipedia.org/wiki/Plane_%28Unicode%29
http://blog.jobbole.com/84903/ 十分钟搞清字符集和字符编码
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 字符编码笔记:ASCII,Unicode和UTF-8
https://mathiasbynens.be/notes/mysql-utf8mb4 How to support full Unicode in MySQL database
http://blog.wpjam.com/article/emoji-for-php-mysql/ Emoji 表情图标在 iOS 与 PHP 之间通信及 MySQL 存储
http://blog.csdn.net/qdkfriend/article/details/7576524 Emoji表情符号兼容方案
http://blog.charlee.li/unicode-intro/
http://www.endmemo.com/unicode/unicodeconverter.php unicode 和utf8的在线转换