一、简介
MySQL在5.5.3之后增加了 utf8mb4 的编码,
mb4就是 most bytes 4 的意思,
专门用来兼容四字节的 unicode。
utf8mb4 是 utf8 的超集,
除了将编码改为 utf8mb4 外不需要做其他转换。
当然,为了节省空间,一般情况下使用utf8也就够了。
utf8mb4
create table code_test( `name` varchar(255) )default charset=utf8mb4; insert into code_test values ('abc'),('12345'),('A,5'),('你好'),('統壹'), ('晚上好~'),('万,!马'),('奔腾'),('Да'),('일요일'),('ニヤーかな'),('ょ'),('نعم'); set @num:=0; select @num:=@num+1,length(`name`),`name` from code_test; truncate table code_test;
utf8
create table code_test2( `name` varchar(255) )default charset=utf8;
insert into code_test2 values ('abc'),('12345'),('A,5'),('你好'),('統壹'), ('晚上好~'),('万,!马'),('/'),('Да'),('일요일'),('ニヤーかな'),('ょ'),('نعم'); set @num:=0; select @num:=@num+1,length(`name`),`name` from code_test2; truncate table code_test2;
insert into code_test2 values ('abc'),('12345'),('A,5'),('你好'),('統壹'), ('晚上好~'),('万,!马'),('奔腾'),('Да'),('일요일'),('ニヤーかな'),('ょ'),('نعم'); > 1366 - Incorrect string value: '\xF0\x9F\x98\x80' for column 'name' at row 8 > 时间: 0.004s
utf8/utf8mb4 英文:一个字节
utf8/utf8mb4 数字:一个字节
utf8/utf8mb4 中文:三个字节
utf8mb4 支持 特殊符号:四个字节
出现顺序 ASCII -> GBK -> Unicode -> UTF-8
二、内容描述 通常计算机在存储字符时,会根据 字符类型 和 编码方式 分配存储空间。 一个字节:作为一个存储单元时,为 8位 二进制数 数字序列。 换算为十进制:最小值0,最大值255。 以下几种编码方式: ①ASCII编码中 一个英文字母(不分大小写)占用 1 个字节的空间 一个中文汉字占用 2 个字节的空间。 ②Unicode编码中 一个英文字符占用 2 个字节的存储空间 一个中文(含繁体)占用 2 个字节的存储空间。 ③UTF-8编码中 一个英文字符占用 1 个字节的存储空间 一个中文(含繁体)占用 3 个字节的存储空间。 ④UTF-16编码中 一个英文字符占用 2 个字节的存储空间 一个汉字字符占用 2 个字节的存储空间 (Unicode扩展区的一些汉字存储需要 4 个字节)。 ⑤UTF-32编码中 世界上任何字符的存储都需要占用 4 个字节的存储空间。
既然utf8能兼容绝大部分的字符,为什么要扩展utf8mb4?
随着互联网的发展,产生了许多新类型的字符,
也就是我们通常在聊天时发的小黄脸表情(四个字节存储),
所以,设计数据库时如果想要允许用户使用特殊符号,
最好使用utf8mb4编码来存储,有更好的兼容性,
但是这样设计会导致耗费更多的存储空间。
————————————————
原文链接:https://blog.csdn.net/qq_27610647/article/details/107981935
字符编码的发展历程
1、字符编码 计算机如果要处理文本,就需要先把文本转换为数字才能处理。 最早的计算机在设计时采用8个比特(bit)作为一个字节(byte), 所以,一个字节能表示的最大的整数就是255(二进制11111111 = 十进制255), 如果要表示更大的整数,就必须用更多的字节。 2 个字节可以表示的最大整数是65535, 4 个字节可以表示的最大整数是4294967295。 2、ASCII 的由来 由于计算机是美国人发明的,所以只出现大小写英文字母、数字和一些符号。 因此,最早只有127个字符被编码到计算机里,也就是7位2进制数字,最高位(第八位)为0。 这个编码表被称为 ASCII 编码,比如数字“0”的编码是48,“A”的编码是65,“a”的编码是97,“z”的编码是122。 3、Unicode 的由来 用 ASCII编码来处理中文,显然一个字节是不够的。 所以,中国制定了 GB2312 编码,至少需要两个字节,而且还不能和 ASCII 编码冲突,用来把中文编进去。 可以想得到的是,日本把日文编到 Shift_JIS 里,韩国把韩文编到 Euc-kr 里,各国有各国的标准,就会不可避免地出现冲突, 结果就是,在多语言混合的文本中,显示出来会有乱码。 这时候,Unicode 应运而生。Unicode 把所有语言都统一到一套编码里,这样就不会再有乱码问题了。 Unicode 编码规范把字符统一定下来,但具体用多少个字节表示他是不管的。 一开始,Unicode 只是2个字节,不断地,更多的字符被编写到 Unicode 中。 Unicode 标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。 现代操作系统和大多数编程语言都直接支持 Unicode 。 ASCII 编码和 Unicode 编码的区别:ASCII 编码是1个字节,而 Unicode 编码通常是2个字节。 4、Unicode 的实现方式 Unicode 的实现方式不同于 Unicode 的编码方式。一个字符的 Unicode 编码是确定的。 但是在实际传输过程中,由于不同系统平台的设计不一定一致, 以及出于节省空间的目的,对 Unicode 编码的实现方式有所不同。 Unicode 的实现方式也称为 Unicode 转换格式(Unicode Transformation Format,简称为UTF), 目前主流的实现方式有 UTF-16 和 UTF-8。 随着Unicode通用字符集的扩充,进而出现了 UTF-32, 但是由于占用空间太大,目前很少有系统选择使用 utf-32 作为系统编码。 5、UTF-8 的由来 汉字中已经超出了 ASCII 编码的范围,用 Unicode 编码是十进制的 20013,二进制的 01001110 00101101。 如果把 ASCII 编码的A用 Unicode 编码,只需要在前面补 0 就可以,因此,A的 Unicode 编码是00000000 01000001。 如果统一成 Unicode 编码,乱码问题从此消失了,但是新的问题又出现了: 如果你写的文本基本全部是英文的话,用 Unicode 编码比 ASCII 编码需要多花一倍的存储空间,在存储和传输上就十分不划算。 所以,本着节约的精神,又出现了把 Unicode 编码 转化为 “可变长编码” 的 UTF-8 编码。 UTF-8 实现方式 把一个 Unicode 字符根据不同的数字大小编码成 1-6 个字节, 常用的英文字母被编码成 1 个字节,汉字通常是 3 个字节,只有很生僻的字符才会被编码成4-6个字节。 如果你要传输大量英文字符,用 UTF-8 编码实现方式 就能节省空间。 我们还可以发现,UTF-8 编码 有一个额外的好处, 就是 ASCII 编码 实际上可以看作是 UTF-8 编码 的一部分, 所以,只支持 ASCII 编码的历史遗留软件可以在 UTF-8 编码下继续工作。 6、后话 搞清楚了 ASCII、Unicode 和 UTF-8 的关系,我们就可以总结一下现在计算机系统通用的字符编码工作方式: 在计算机内存中,统一使用 Unicode 编码,当需要保存到硬盘或者需要传输的时候,就转换为 UTF-8 编码。 用记事本编辑的时候,从文件读取的 UTF-8 字符被转换为 Unicode 字符到内存里, 编辑完成后,保存的时候再把 Unicode 转换为 UTF-8 保存到文件。 浏览网页的时候,服务器会把动态生成的 Unicode 内容转换为 UTF-8 再传输到浏览器。 所以你看到很多网页的源码上会有类似的信息,表示该网页正是用的 UTF-8 编码。
————————————————
原文链接:https://blog.csdn.net/zeng_ll/article/details/88714847