首页 > 数据库 >mysql字符集utf8和utf8mb4的使用问题

mysql字符集utf8和utf8mb4的使用问题

时间:2022-12-03 23:32:53浏览次数:43  
标签:字符 编码 字节 utf8mb4 utf8 MySQL length mysql +------+------+


一、MySQL中length()、char_length()的区别和用法

char_length(str)

  • 计算单位:字符
  • 不管汉字还是数字或者是字母都算是一个字符

length(str)

  • 计算单位:字节
  • utf8编码:一个汉字三个字节,一个数字或字母一个字节。
  • gbk编码:一个汉字两个字节,一个数字或字母一个字节。
mysql> SELECT CHAR_LENGTH('码农') '字符', LENGTH('码农') '字节';
+------+------+
| 字符 | 字节 |
+------+------+
| 2 | 6 |
+------+------+

mysql> SELECT CHAR_LENGTH('码农Lin') '字符', LENGTH('码农Lin') '字节';
+------+------+
| 字符 | 字节 |
+------+------+
| 5 | 9 |
+------+------+

mysql> SELECT CHAR_LENGTH('码农Lin1') '字符', LENGTH('码农Lin1') '字节';
+------+------+
| 字符 | 字节 |
+------+------+
| 6 | 10 |
+------+------+

扩展

MySQL5.0.3版本之后varchar类型大小的计算方式有所变化,从最早的按字节算大小varchar(length)改成了varchar(char_length)。

  • MySQL 5.0.3 之前:
  • 数据类型大小:0–255字节
  • 详解:varchar(20)中的20表示字节数,如果存放utf-8编码的话只能放6个汉字。varchar(n),这里的n表示字节数。
  • MySQL 5.0.3之后:
  • 数据类型大小:0–65535字节,但最多占65532字节(其中需要用两个字节存放长度,小于255字节用1个字节存放长度)
  • 详解:varchar(20)表示字符数,不管什么编码,不管是英文还是中文都可以存放20个。

 

二、utf8mb4用途

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。

这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。

 

将emoji文字直接写入SQL中,执行insert语句报错;

INSERT INTO `csjdemo`.`student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`) 
VALUES ('20', '陈哈哈

标签:字符,编码,字节,utf8mb4,utf8,MySQL,length,mysql,+------+------+
From: https://blog.51cto.com/u_15891990/5908823

相关文章

  • 面试大厂 看这篇MySQL面试题就够了
    MySQL一直是面试中的热点问题,也难道了很多的面试者。其实MySQL没那么难,只是大家没有系统化、实战性的过去学习、总结。同时很多开发者在实际的开发过程中也很少去接触一些偏......
  • mysql和sql server的区别是什么?
    https://blog.csdn.net/qq_51179608/article/details/124322292实际上,每个web应用程序和数据库都扮演着重要的角色。由于当前web开发的动态特性,即使是最基本的应用程序也......
  • cpp mysql ubuntu
    1.Installlibmysqlcppconn-devsudoapt-getinstalllibmysqlcppconn-dev2.//MySQLHelper.h#include<iostream>#include<mysql_connection.h>#include<mysql......
  • mysql--约束
        外键约束:altertableempaddconstraintfk_emp_dept_idforeignkey(dept_id)referencesdept(id);添加主键altertableempdropforeignkeyfk_em......
  • [MySQL] 索引失效的情况
    1.查询条件中有or,即使有部分条件带索引也会失效2.like查询是以%开头3.如果列类型是字符串,那在查询条件中需要将数据用引号引用起来,否则不走索引4.索引列上参与计算......
  • MySQL 5.7 主从复制 GTID
    GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID主库#开启gtidlog-bin=mysql-binexpire_logs_days=5binlog_format=mixedserver-id=1gtid_mode=onenforce_g......
  • MySQL数据库之事务
    一、事务的概念事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么......
  • sql递归查询-mysql8为例
    总体描述数据准表通过CTE实现,当前版本是mariadb8.0.31,于mysql8相当。数据表(也就是原表):select*fromrecurrenceaidparent_id全球null中国全球......
  • centos8 手动卸载mysql
    首先得停止mysql的服务,然后查找mysql文件用find/-namemysql   rm-rf删掉所有的mysql文件删掉后删除配置文件rm-rf/etc/my.cofrm-rf/etc/init.d/mysql......
  • mysql 常见锁的类型(一)
    @[toc]一、锁的分类1.1加锁的目的当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况,若对并发操作不加控制就可能会读取和存储不正确的数据,破......