mysql 编码和汉字存储占用字节问题的探索

MySql 5.5 之前,UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区,BMP是从哪到哪?
戳这里 基本就是 0000 ~ FFFF 这一区。

从MySQL 5.5 开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。

utf8mb4 is a superset of utf8

tf8mb4兼容utf8,且比utf8能表示更多的字符。

至于什么时候用,看你做的什么项目了。。。
在做移动应用时,会遇到IOS用户在文本的区域输入emoji表情,如果不做一定处理,就会导致插入数据库异常。

MySql 5.0 以上的版本:

1、一个汉字占多少长度与编码有关:

UTF-8:一个汉字 = 3个字节,英文是一个字节
GBK: 一个汉字 = 2个字节,英文是一个字节
2、varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入 n 个字符,仅实际字节长度有所区别。

3、MySQL检查长度,可用SQL语言 SELECT LENGTH(fieldname) FROM tablename 这个命令可以看到各行使用的字节数。

mysql版本5.6.32-78.0下面用实际例子来说明问题:

  1. 首先创建一张临时用表:

     create TEMPORARY table medivac(
          name VARCHAR(10)
     ); CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  1. 插入一些数据:

    INSERT INTO medivac (name) VALUES ('' at line 1
    mysql> INSERT INTO medivac (name) VALUES ('a');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO medivac (name) VALUES ('哈');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO medivac (name) VALUES ('\U+1F604');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> INSERT INTO medivac (name) VALUES ('哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈');
    Query OK, 1 row affected, 1 warning (0.00 sec)
  2. 查看表中数据:

    mysql> select * from medivac
        -> ;
    +--------------------------------+
    | name                           |
    +--------------------------------+
    | a                              |
    | 哈                             |
    | ?                               |
    | 哈哈哈哈哈哈哈哈哈哈           |
    +--------------------------------+
  3. 查看占用字节数:

    +--------------+
    | length(name) |
    +--------------+
    |            1 |
    |            3 |
    |            4 |
    |           30 |
    +--------------+
    

没什么好说的 一目了然,注意,如果存储超过字段规定的最大字符数,后面存储的东西会被无视,并且曝出一个warning。详见过程2的信息。

总结:

  1. 一个varchar存汉字需要使用三个字段在utf8和utf8mb4编码表的情况下。

  2. 如果需要存储emoji表情的需求,新表的默认编码方式应该写为utf8mb4。另外提一点在最新发布的mysql8.0里面,默认编码方式已经是utf8mb4了。

  3. 在utf8和utf8mb4中 varchar(n)这个n是字符,所见即所得,一个a是一个字符一个?也是一个字符 不过就是a这个字符是1个字节 哈这个字符是3个字节 而?这个字符是4个字节表示罢了

Reference:

https://www.tutorialspoint.co... MySQL Temporary Tables

https://ruby-china.org/topics... MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚


piperck的技术栈
是的。我就是喜欢有事没事写东西?

更多文章:[链接]

446 声望
2 粉丝
0 条评论
推荐阅读
花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥14阅读 1.9k

封面图
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
Vue+Express+Mysql全栈项目之增删改查、分页排序导出表格功能
本文记录一下实现一个全栈项目,前端使用vue框架、后端使用express框架、数据库使用mysql。此项目的意义不仅仅有助于我们复习nodejs相关知识、更有助于带前端新人,使其快速从整体全局角度中,理解常规后台管理系...

水冗水孚4阅读 2.6k

MySQL百万数据深度分页优化思路分析
一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万...

一个程序员的成长7阅读 893

封面图
深入理解MySQL索引底层数据结构
在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没...

京东云开发者3阅读 581

封面图
Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.4k

一文了解MySQL中的多版本并发控制
作者:京东零售  李泽阳最近在阅读《认知觉醒》这本书,里面有句话非常打动我:通过自己的语言,用最简单的话把一件事情讲清楚,最好让外行人也能听懂。也许这就是大道至简,只是我们习惯了烦琐和复杂。希望借助...

京东云开发者2阅读 501

封面图

更多文章:[链接]

446 声望
2 粉丝
宣传栏