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主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
Mysql基础知识点汇总
May 26 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
带你学习MySQL执行计划
May 31 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
MySQL学习之基础操作总结
Mar 19 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 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统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
PHP队列场景以及实现代码实例详解
2021/02/26 PHP
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
node.js实现回调的方法示例
2017/03/01 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
js实现按座位号抽奖
2017/04/05 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
javascript 代码是如何被压缩的示例代码
2020/05/06 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
使用Python对Excel进行读写操作
2017/03/30 Python
Python入门_条件控制(详解)
2017/05/16 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Django实现文件上传下载
2019/10/06 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
工程概预算专业毕业生求职信
2013/10/04 职场文书
学前班语言教学计划
2015/01/20 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL