博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 编码和汉字存储占用字节问题的探索
阅读量:6439 次
发布时间:2019-06-23

本文共 1886 字,大约阅读时间需要 6 分钟。

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 1mysql> 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:

MySQL Temporary Tables

MySQL 数据库 varchar 到底可以存多少个汉字,多少个英文呢?我们来搞搞清楚

转载地址:http://zakwo.baihongyu.com/

你可能感兴趣的文章
在Linux上安装Python3.6.1
查看>>
[基础]iOS 可视化编程(全系列)
查看>>
我的友情链接
查看>>
LVS之NAT模型配置实验
查看>>
nginx 报错 99: Cannot assign requested address
查看>>
几种流行的AJAX框架:jQuery,Mootools,Dojo,Ext JS的对比
查看>>
Socket-Client通信
查看>>
Maven搭建简单的SS项目
查看>>
#我要上首页# 新版博客首页来了,做明星博主还会远吗?
查看>>
PHP缓存技术
查看>>
关于SOCKET资源堆栈
查看>>
笔记 百度搜索
查看>>
控制台 - 网络管理之华为交换机 S系列端口限速
查看>>
我的友情链接
查看>>
linux为启动菜单加密码
查看>>
MySQL5.5编译方式安装实战
查看>>
细谈Ehcache页面缓存的使用
查看>>
GridView如何设置View的初始样式
查看>>
Placeholder in IE8 and older
查看>>
SQL语句字符串处理大全
查看>>