首页 > 数据库 >Mysql 字符集问题:utf8与utf8mb4

Mysql 字符集问题:utf8与utf8mb4

时间:2023-05-29 17:14:42浏览次数:50  
标签:ci set utf8mb4 utf8 字符集 默认 Mysql character

UTF-8 编码是一种变长的编码机制,可以用1~4个字节存储字符。

MySQL 中的 utf8 编码并不是真正的 UTF-8,其最长只有3个字节。当遇到占4个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常。

从 5.5.3 开始,MySQL 开始用 utf8mb4 编码来实现完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4个字节。

从 8.0 之后,将会在某个版本开始用 utf8mb4 作为默认字符编码。

字符集 utf8mb4
utf8mb4 已成为 MySQL 8.0 的默认字符集,在MySQL 8.0.1及更高版本中将utf8mb4_0900_ai_ci 作为默认排序规则。

创建数据库时,如果没有指定字符集,会采用服务器的默认字符集。设置服务器默认字符集为 utf8mb4 可以提高便利性。

show variables like "%char%";

character_set_client:客户端请求数据的字符集
character_set_connection:从客户端接收到数据,然后传输的字符集
character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,
那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。 character_set_filesystem:把操作系统上的文件名转化成此字符集,即把 character_set_client转换 character_set_filesystem, 默认binary是不做任何转换的 character_set_results:结果集的字符集 character_set_server:数据库服务器的默认字符集 character_set_system:存储系统元数据的字符集,总是 utf8,不需要设置

 

排序字符集 collation
字符除了需要存储,还需要排序或比较大小。推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。

MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:

uft8mb4 表示用 UTF-8 编码方案,每个字符最多占4个字节。
0900 指的是 Unicode 校对算法版本。(Unicode归类算法是用于比较符合Unicode标准要求的两个Unicode字符串的方法)。
ai指的是口音不敏感。也就是说,排序时e,è,é,ê和ë之间没有区别。
ci表示不区分大小写。也就是说,排序时p和P之间没有区别。
utf8mb4 已成为默认字符集,在MySQL 8.0.1及更高版本中将utf8mb4_0900_ai_ci作为默认排序规则。
以前,utf8mb4_general_ci是默认排序规则。由于utf8mb4_0900_ai_ci排序规则现在是默认排序规则,
因此默认情况下新表格可以存储基本多语言平面之外的字符。现在可以默认存储表情符号。
如果需要重音灵敏度和区分大小写,则可以使用utf8mb4_0900_as_cs代替

 

参考:https://blog.csdn.net/weixin_43861716/article/details/115326271

标签:ci,set,utf8mb4,utf8,字符集,默认,Mysql,character
From: https://www.cnblogs.com/wongzzh/p/17441015.html

相关文章

  • 如何将数据从MySQL/MongoDB中迁移至云开发数据库
    本篇文章从MySQL、MongoDB迁移到云开发数据库,其他数据库迁移也都大同小异~迁移大致分为以下几步?:从MySQL、MongoDB将数据库导出为JSON或CSV格式创建一个云开发环境到云开发数据库新建一个集合在集合内导入JSON或CSV格式文件Mysql迁移到云开发数据库为了方便,我们使用Na......
  • mysql 8 修改默认密码并修改密码策略
    1、使用默认密码登陆2、修改默认密码(必须修改默认密码)ALTERUSER'root'@'localhost'IDENTIFIEDBY'Mysql@23';3、修改默认密码策略SHOWVARIABLESLIKE'validate_password%';setglobalvalidate_password.policy=0;setglobalvalidate_password.lengt......
  • mysql之sql查询结果集小数保留
    客户要求,跟金额相关的数据,打印出来要保留两位小数,比如:13.2/13.200要显示为13.20;分析:首先查看数据库中的数据定义,均为decimal(12,2),直接通过数据库查询的结果也会保留两位小数,但是代码处理后,却会忽略掉最后一个“零”位。此处有两个解决方案:一、代码中处理,检测到为金额字......
  • 简单MySQL例子演示MVCC
    一沈秋园,满庭霜落,云烟北桥夜连城MVCC是多版本并发控制的缩写,是一种数据库和编程语言中常用的并发控制方法。它通过保存数据的历史版本,实现对数据库的高效访问。MySQL中MVCC主要是通过行记录中的隐藏字段(隐藏主键row_id,事务IDtrx_id,回滚指针roll_pointer),undo_log(版本链),Rea......
  • docker部署ZeLog项目(Tomcat+MySQL+ZrLog)
    一.docker的安装1.1、在安装dockers之前,建议关闭Centos7.9防火墙[root@192~]#systemctlstopfirewalld[root@192~]#setenforce0 setenforce是Linux的selinux防火墙配置命令执行setenforce0表示临时关闭selinux防火墙1.2、通过yum在线安装Docker服务[root@localhos......
  • mysql快速对比两个数据库表名的差异
    2023年5月29日14:51:02因为正式库老是和测试库有差1-2张表,表也有100张了,排除差异有点麻烦SELECTtable_nameFROMinformation_schema.TABLESWHEREtable_schema='数据库名'这样就得到两个数据库表名列新建两个txt,database.txt和database_test.txt选中两个文件,右键使用T......
  • 玩转MySQL数据库之SQL优化之慢查询
    本系列为:MySQL数据库详解,为千锋资深教学老师独家创作,致力于为大家讲解清晰MySQL数据库相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~文末有本文重点总结,技术类问题,也欢迎大家和我们沟通交流!前言从今天开始本系列文章就带各位小伙伴学习......
  • MySQL索引(一)
    雨喝醉了,小路摇摇晃晃,倒在我怀里1,B树和B+树之间的区别是什么?2,Innodb中的B+树有什么特点?3,什么是Innodb中的page?4,Innodb中的B+树是怎么产生的?5,什么是聚簇索引?6,Innodb是如何支持范围查找能走索引的?7,什么是联合索引?对应的B+树是如何产生的?8,什么是最左前缀原则?......
  • mysql、sqlserver、oracle分页,java分页统一接口实现
    定义:pageStart起始页,pageEnd终止页,pageSize页面容量oracle分页:rownum numfrom(实际传的SQL)where rownum<=pageEnd)wherenum>=pageStartsqlServer分页:           select*from(select top 页面容量from(select top字段Adesc)astemptable2orderb......
  • MYSQL round()函数
    在mysql中,round函数用于数据的四舍五入,它有两种形式:1、round(x,d) ,x指要处理的数,d是指保留几位小数这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;2、round(x) ,其实就是round(x,0),也就是默认d为0;下面是几个实例1、查询: selectro......