MySQL中utf8mb4排序规则示例

 更新时间:2021年07月29日 14:34:00   作者:TeyGao  
本文主要介绍了MySQL中utf8mb4排序规则,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在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排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows服务器下MySql数据库单向主从备份详细实现步骤分享

    Windows服务器下MySql数据库单向主从备份详细实现步骤分享

    将主服务器中的MySql数据库同步到从服务器中,使得对主服务器的操作可以即时更新到从服务器,避免主服务器因环境或者网络异常一时无法使用,达到备份效果,这篇文章整理的确实挺详细的
    2012-05-05
  • MySQL 5.7.43下载安装配置的超详细教程

    MySQL 5.7.43下载安装配置的超详细教程

    这篇文章主要介绍了MySQL 5.7.43下载安装配置的超详细教程,本文通过实例图文结合的形式给大家介绍的非常详细,对大家的学习或工作具有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • MYSQL清空表和截断表问题

    MYSQL清空表和截断表问题

    这篇文章主要介绍了MYSQL清空表和截断表问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • mysql中coalesce()的使用技巧小结

    mysql中coalesce()的使用技巧小结

    在mysql中,其实有不少方法和函数是很有用的,这次介绍一个叫coalesce的,拼写十分麻烦,但其实作用是将返回传入的参数中第一个非null的值,下面这篇文章主要给大家介绍了在mysql中coalesce()使用技巧的相关资料,需要的朋友可以参考下。
    2017-06-06
  • 定位和优化mysql慢查询的常见方法分享

    定位和优化mysql慢查询的常见方法分享

    MySQL中的慢查询(Slow Query)指执行时间超过指定阈值的查询语句,默认阈值是long_query_time参数设置的秒值,MySQL有几种常见的方法可以发现和获取慢查询,接下来小编将给大家详细的介绍一下这些方法,需要的朋友可以参考下
    2023-08-08
  • MYSQL错误:Can’t open file: ‘×××.MYI’ (errno: 145)修复方法

    MYSQL错误:Can’t open file: ‘×××.MYI’ (errno: 14

    这个错误是典型的mysql表受损造成的,解决的办法就是修复表,这个问题也是mysql经常容易出现的,mysql表和索引损坏的几率很大,但是修复也很方便
    2011-01-01
  • 详解MySQL和Redis如何保证数据一致性

    详解MySQL和Redis如何保证数据一致性

    MySQL与Redis都是常用的数据存储和缓存系统,为了提高应用程序的性能和可伸缩性,很多应用程序将MySQL和Redis一起使用,其中MySQL作为主要的持久存储,而Redis作为主要的缓存,那么本文就给大家介绍一下MySQL和Redis如何保证数据一致性,需要的朋友可以参考下
    2023-08-08
  • MySQL中因一个双引号错位引发的血案详析

    MySQL中因一个双引号错位引发的血案详析

    这篇文章主要给大家介绍了关于MySQL中因一个双引号错位引发的血案的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 关于mysql中时间日期类型和字符串类型的选择

    关于mysql中时间日期类型和字符串类型的选择

    大家好,本篇文章主要讲的是关于mysql中时间日期类型和字符串类型的选择,感兴趣的朋友赶快来看一看吧,希望对你有帮助
    2021-11-11
  • 允许远程用户访问mysql服务sql语句

    允许远程用户访问mysql服务sql语句

    本节主要介绍了如何允许远程用户访问mysql服务,本例授权192.168.14.1 主机的cakephp用户访问cakephp数据库
    2014-07-07

最新评论