MySql中数据库编码我推荐utf8mb4
MySQL 中 utf8 和 utf8mb4 的区别
在电脑上处理文字的时候,你可能经常接触到一个名词,叫UTF-8。
你会不会觉得一丝疑惑,这到底是什么东西?
用一句话说明的话,UTF-8是一种编码格式,一个字节包含8个比特。
等会,什么是编码,什么又是比特?为什么要用这个东西?
编码
我们都知道人有人的语言,计算机有计算机的语言,就是机器语言,所谓的二进制,0和1,1代表有一个信号,0表示没有信号。由0和1组成的计算机语言的字符串去翻译我们生活中对应字符的这个过程我们称之为编码。
ASCII
ASCII是由美国出台的信息交换标准代码,是现在通用的单字节编码系统。(我们俗说的计算机语言)
比特
因为ASIIC码有8位数,每位是一个比特 (bit),8位就是一个字节 (byte)。
为什么会有UTF-8
因为世界上各国语言字符类型都比较多,且对可以用ASCII表示的字符使用UNICODE并不高效,因为Unicode比ASCII码占用大一倍的空间,对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符及,他们被称为通用转换格式,即UTF(Unicode Transformation Format)。常见的UTF格式有UTF-7, UTF-7.5, UTF-8,UTF-16, 以及 UTF-32。
字符集为每个字符分配了一个唯一的编号,通过这个编号就能找到对应的字符。在编程过程中我们经常会使用字符,而使用字符的前提就是把字符放入内存中,毫无疑问,放入内存中的仅仅是字符的编号,而不是真正的字符实体。
Unicode 可以使用的编码有三种,分别是:
- UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符。
UTF-8 的编码规则就是:如果只有一个字节,那么最高的比特位为 0;如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的字节均以 10 开头。
只有 UTF-8 兼容 ASCII,UTF-32 和 UTF-16 都不兼容 ASCII,因为它们没有单字节编码。
回顾标题为什么MySql中不建议使用UTF-8?
事情起源于我一次操作数据库表时存储表情(emoji)字符串,报了> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘,"\xF0\x9F\x98\x93","\xF0\x9F\x98\x93",0)’ at line 1 的错误,各种排查自己代码,发现自己用的一直都是UTF-8的字符编码。
网上查了很多人建议将数据库系统编码UTF-8改成utf8mb4即可。
那么为什么要修改呢?
在 MySQL中,“utf8”编码只支持每个字符最多三个字节,而标准的 UTF-8编码是每个字符最多四个字节。
在MySQL5.53中,mysql更新了utf8mb4这个系统编码,mb4就是most bytes 4的意思,支持了特殊符号和繁体字,专门用来兼容四字节的unicode。utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。