MySQL中utf8mb4排序规则示例


Posted in MySQL onAugust 02, 2021

在MySQL中常见的utf8mb4排序规则有:

  • utf8mb4_0900_ai_ci
  • utf8mb4_unicode_ci
  • utf8mb4_general_ci

当设置表的默认字符集为utf8mb4字符集但未明确指定排序规则时:

  • 在MySQL 5.7版本中,默认排序规则为utf8mb4_general_ci。
  • 在MySQL 8.0版本中,默认排序规则为utf8mb4_0900_ai_ci。

由于utf8mb4_0900_ai_ci排序规则时MySQL 8.0引入的排序规则,因此将MySQL 8.0版本的表导入到MySQL 5.7或MySQL 5.6版本时,会存在字符集无法识别的问题。

[Err] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'

参数控制

在MySQL 5.6版本中,参数collation_server用于设置服务器级别的默认排序规则。

  • 如果服务启动时未指定参数collation_database的值,则默认继承参数collation_server的值。
  • 如果创建数据库时未指定排序规则,则默认使用参数collation_database的值。

参数character_set_database和collation_database在MySQL 5.7版本中被遗弃并将在后续版本中移除。
MySQL新增参数default_collation_for_utf8mb4用于控制使用utf8mb4字符集时的默认排序规则,取值为utf8mb4_0900_ai_ci或utf8mb4_general_ci
参数default_collation_for_utf8mb4在下列条件中生效:

  • 使用SHOW COLLATION and SHOW CHARACTER SET 命令时。
  • 在创建库或修改库指定utf8mb4但未指定编码规则时。
  • 在创建表或修改表指定utf8mb4但未指定编码规则时。
  • 在增加列或修改列指定utf8mb4但未指定编码规则时。
  • 其他使用utf8mb4但未指定编码规则时。

utf8mb4_unicode_ci和utf8mb4_general_ci对比

1、准确性

  • utf8mb4_unicode_ci排序规则基于标准unicode进行排序和比较,能处理特殊的字符,能在各种语音中精确排序。
  • utf8mb4_general_ci排序规则没有基于标准unicode,无法处理部分特殊字符。

2、性能

  • utf8mb4_general_ci排序规则在排序性能上相对较好
  • utf8mb4_unicode_ci排序规则为处理特殊字符实现复杂的排序算法,性能略差
  • 在大部分场景下,两者没有明显的性能差异

补:MySQL--utf8mb4与等值查询测试

测试脚本

## 删除测试表
DROP TABLE IF EXISTS tb2001;
DROP TABLE IF EXISTS tb2002;
DROP TABLE IF EXISTS tb2003;

## 创建测试表
CREATE TABLE tb2001(
id INT AUTO_INCREMENT PRIMARY KEY,
c1 VARCHAR(100) COLLATE utf8mb4_unicode_ci,
c2 VARCHAR(100) COLLATE utf8mb4_bin
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 ;

CREATE TABLE tb2002(
id INT AUTO_INCREMENT PRIMARY KEY,
c1 VARCHAR(100) COLLATE utf8mb4_general_ci,
c2 VARCHAR(100) COLLATE utf8mb4_bin
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

CREATE TABLE tb2003(
id INT AUTO_INCREMENT PRIMARY KEY,
c1 VARCHAR(100) COLLATE utf8mb4_0900_ai_ci,
c2 VARCHAR(100) COLLATE utf8mb4_bin
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

## 插入测试数据
INSERT INTO tb2001(c1,c2)VALUES(0xF09F8D83,0xF09F8D83),(0xF09FA68A,0xF09FA68A),(0xF09F8CA0,0xF09F8CA0);
INSERT INTO tb2002(c1,c2)VALUES(0xF09F8D83,0xF09F8D83),(0xF09FA68A,0xF09FA68A),(0xF09F8CA0,0xF09F8CA0);
INSERT INTO tb2003(c1,c2)VALUES(0xF09F8D83,0xF09F8D83),(0xF09FA68A,0xF09FA68A),(0xF09F8CA0,0xF09F8CA0);

## 等值查询测试
SELECT * FROM tb2001 WHERE c1=0xF09F8D83;
SELECT * FROM tb2002 WHERE c1=0xF09F8D83;
SELECT * FROM tb2003 WHERE c1=0xF09F8D83;

SELECT * FROM tb2001 WHERE c2=0xF09F8D83;
SELECT * FROM tb2002 WHERE c2=0xF09F8D83;
SELECT * FROM tb2003 WHERE c2=0xF09F8D83;

测试结果

mysql> SELECT * FROM tb2001 WHERE c1=0xF09F8D83;
+----+------+------+
| id | c1   | c2   |
+----+------+------+
|  1 | ?     | ?     |
|  2 | ?     | ?     |
|  3 | ?     | ?     |
+----+------+------+
3 rows in set (0.00 sec)

mysql> SELECT * FROM tb2002 WHERE c1=0xF09F8D83;
+----+------+------+
| id | c1   | c2   |
+----+------+------+
|  1 | ?     | ?     |
|  2 | ?     | ?     |
|  3 | ?     | ?     |
+----+------+------+
3 rows in set (0.01 sec)

mysql> SELECT * FROM tb2003 WHERE c1=0xF09F8D83;
+----+------+------+
| id | c1   | c2   |
+----+------+------+
|  1 | ?     | ?     |
+----+------+------+
1 row in set (0.00 sec)

mysql> 
mysql> SELECT * FROM tb2001 WHERE c2=0xF09F8D83;
+----+------+------+
| id | c1   | c2   |
+----+------+------+
|  1 | ?     | ?     |
+----+------+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM tb2002 WHERE c2=0xF09F8D83;
+----+------+------+
| id | c1   | c2   |
+----+------+------+
|  1 | ?     | ?     |
+----+------+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM tb2003 WHERE c2=0xF09F8D83;
+----+------+------+
| id | c1   | c2   |
+----+------+------+
|  1 | ?     | ?     |
+----+------+------+
1 row in set (0.00 sec)

测试总结

  • 使用utf8mb4字符集能存储特殊字符如表情符号。
  • utf8mb4_unicode_ci和utf8mb4_general_ci排序规则无法"正确匹配"特殊字符。
  • utf8mb4_0900_ai_ci排序规则能"正确匹配"特殊字符,但仅适用MySQL 8.0版本。
  • utf8mb4_bin排序规则基于二级制方式匹配特殊字符,能"正确匹配"特殊字符,适用于MySQL各个版本。

到此这篇关于MySQL中utf8mb4排序规则示例的文章就介绍到这了,更多相关MySQL utf8mb4排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL表的增删改查基础教程
Apr 07 MySQL
MySQL Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
解决Mysql中的innoDB幻读问题
Apr 29 MySQL
MySQL数据库中的锁、解锁以及删除事务
May 06 MySQL
mysql全面解析json/数组
Jul 07 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 MySQL
MySql子查询IN的执行和优化的实现
MySQL里面的子查询的基本使用
Aug 02 #MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
Aug 02 #MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
使用ORM新增数据在Mysql中的操作步骤
Jul 26 #MySQL
mysql脏页是什么
Jul 26 #MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 #MySQL
You might like
php获取网页里所有图片并存入数组的方法
2015/04/06 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP编辑器PhpStrom运行缓慢问题
2017/02/21 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
首页图片漂浮效果示例代码
2014/06/05 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
vue登录路由验证的实现
2017/12/13 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
微信小程序画布圆形进度条显示效果
2020/11/17 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
Python中偏函数用法示例
2018/06/07 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
django使用xadmin的全局配置详解
2019/11/15 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
应届毕业生求职信
2013/11/30 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
股指期货心得体会
2014/09/13 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
售票员岗位职责
2015/02/15 职场文书
小马王观后感
2015/06/11 职场文书
教师正风肃纪心得体会
2016/01/15 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
解决numpy数组互换两行及赋值的问题
2021/04/17 Python