• utf8 和 utf8mb4 的区别


    一、简介

    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。
    
    2ASCII 的由来
    由于计算机是美国人发明的,所以只出现大小写英文字母、数字和一些符号。
    因此,最早只有127个字符被编码到计算机里,也就是7位2进制数字,最高位(第八位)为0。
    这个编码表被称为 ASCII 编码,比如数字“0”的编码是48,“A”的编码是65,“a”的编码是97,“z”的编码是122。
    
    3Unicode 的由来
    用 ASCII编码来处理中文,显然一个字节是不够的。
    所以,中国制定了 GB2312 编码,至少需要两个字节,而且还不能和 ASCII 编码冲突,用来把中文编进去。
    可以想得到的是,日本把日文编到 Shift_JIS 里,韩国把韩文编到 Euc-kr 里,各国有各国的标准,就会不可避免地出现冲突,
    结果就是,在多语言混合的文本中,显示出来会有乱码。
    这时候,Unicode 应运而生。Unicode 把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
    Unicode 编码规范把字符统一定下来,但具体用多少个字节表示他是不管的。
    一开始,Unicode 只是2个字节,不断地,更多的字符被编写到 Unicode 中。
    Unicode 标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。
    现代操作系统和大多数编程语言都直接支持 UnicodeASCII 编码和 Unicode 编码的区别:ASCII 编码是1个字节,而 Unicode 编码通常是2个字节。
    
    4Unicode 的实现方式
    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、后话
    搞清楚了 ASCIIUnicode 和 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

  • 相关阅读:
    课程作业08:课后作业之字串加密、动手动脑之String.equals()方法、整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明、阅读笔记发表到博客园。
    课程作业07:请编写一个程序,使用上述算法加密或解密用户输入的英文字符串。
    课程作业06:验证课件上的代码,并将所有的动手动脑或要求发表博客作业部分整理成一篇博客发表。
    课程作业05:使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”
    Django 学习之用户认证组件auth与User对象
    Django 学习之中间件Middleware
    Django学习 之后端视图与ajax
    Django 学习之cookie与session
    Django 学习 之ORM聚合查询分组查询与F查询与Q查询
    Django 学习 之ORM多表操作
  • 原文地址:https://www.cnblogs.com/chang09/p/16561166.html
Copyright © 2020-2023  润新知