首页 > 数据库 >MySQL字符集和排序规则详解

MySQL字符集和排序规则详解

时间:2024-08-28 18:28:45浏览次数:7  
标签:ci name utf8mb4 bs 字符集 详解 大小写 MySQL 排序

前言

MySQL中,字符集和排序规则在处理文本数据时起着至关重要的作用,本文将详细介绍 MySQL中的字符集和排序规则。

简介

字符集(Character Set):

  • 字符集定义了数据库中可以存储的字符的集合。在MySQL中,常见的字符集包括utf8、utf8mb4、latin1等。
  • utf8mb4字符集是用于在MySQL中存储Unicode字符集(包括Emoji等特殊字符)的一种字符集,提供更广泛的字符支持。

排序规则(Collation):

  • 排序规则定义了如何对字符进行比较和排序。不同的排序规则会影响字符比较的结果。
  • 排序规则由字符集和排序方式组成,例如utf8_general_ci、utf8mb4_unicode_ci等。

字符集

常见字符集 以及 说明

  1. utf8
    • UTF-8 是一种变长字符编码,可以表示世界上几乎所有的字符。utf8是MySQL中常用的字符集,但在处理某些特殊字符(如 Emoji)时可能会有问题。
  2. utf8mb4
    • utf8mb4 是 utf8 的超集,支持存储更广泛的字符范围(包括 Emoji 等)。通常用于支持更广泛的语言和符号。
  3. latin1
    • Latin1 是一种较老的字符集,适用于大多数西欧语言和部分其他语言的字符。
  4. latin2
    • Latin2 是扩展的 Latin1 字符集,支持中东欧语言中的额外字符。
  5. cp1251
    • CP1251 是常用于俄语的字符集。
  6. utf16
    • UTF-16 是一种固定长度字符编码,用于表示 Unicode 字符。每个字符占两个字节。
  7. utf32
    • UTF-32 是一种固定长度字符编码,用于表示 Unicode 字符。每个字符占四个字节。
  8. binary
    • Binary 字符集以二进制方式存储数据,并且对存储的数据进行大小写敏感的比较。
  9. ascii
    • ASCII 字符集只支持 ASCII 字符集中的字符,范围较窄。

大多数选择 utf8mb4 字符集 同时也支持表情存储

排序规则

常见的排序规则

以字符集 utf8mb4 为例

  • utf8mb4_bin:这是一个大小写敏感的二进制排序规则,直接根据字符的二进制值进行比较,区分大小写。
  • utf8mb4_croatian_ci:克罗地亚语的大小写不敏感排序规则,适用于克罗地亚语文本的比较和排序。
  • utf8mb4_czech_ci:捷克语的大小写不敏感排序规则,适用于捷克语文本的比较和排序。
  • utf8mb4_danish_ci:丹麦语的大小写不敏感排序规则,适用于丹麦语文本的比较和排序。
  • utf8mb4_esperanto_ci:世界语的大小写不敏感排序规则,适用于世界语文本的比较和排序。
  • utf8mb4_estonian_ci:爱沙尼亚语的大小写不敏感排序规则,适用于爱沙尼亚语文本的比较和排序。
  • utf8mb4_general_ci:这是一个通用的大小写不敏感排序规则,适用于大多数情况下的文本比较和排序。
  • utf8mb4_german2_ci:德语的大小写不敏感排序规则,适用于德语文本的比较和排序。
  • utf8mb4_hungarian_ci:匈牙利语的大小写不敏感排序规则,适用于匈牙利语文本的比较和排序。
  • utf8mb4_icelandic_ci:冰岛语的大小写不敏感排序规则,适用于冰岛语文本的比较和排序。
  • utf8mb4_latvian_ci:拉脱维亚语的大小写不敏感排序规则,适用于拉脱维亚语文本的比较和排序。
  • utf8mb4_lithuanian_ci:立陶宛语的大小写不敏感排序规则,适用于立陶宛语文本的比较和排序。
  • utf8mb4_persian_ci:波斯语的大小写不敏感排序规则,适用于波斯语文本的比较和排序。
  • utf8mb4_polish_ci:波兰语的大小写不敏感排序规则,适用于波兰语文本的比较和排序。
  • utf8mb4_roman_ci:罗马尼亚语的大小写不敏感排序规则,适用于罗马尼亚语文本的比较和排序。
  • utf8mb4_romanian_ci:罗马尼亚语的大小写不敏感排序规则,适用于罗马尼亚语文本的比较和排序。
  • utf8mb4_sinhala_ci:僧伽罗语的大小写不敏感排序规则,适用于僧伽罗语文本的比较和排序。
  • utf8mb4_slovak_ci:斯洛伐克语的大小写不敏感排序规则,适用于斯洛伐克语文本的比较和排序。
  • utf8mb4_slovenian_ci:斯洛文尼亚语的大小写不敏感排序规则,适用于斯洛文尼亚语文本的比较和排序。
  • utf8mb4_spanish2_ci:西班牙语的大小写不敏感排序规则,适用于西班牙语文本的比较和排序。
  • utf8mb4_spanish_ci:西班牙语的大小写不敏感排序规则,适用于西班牙语文本的比较和排序。
  • utf8mb4_swedish_ci:瑞典语的大小写不敏感排序规则,适用于瑞典语文本的比较和排序。
  • utf8mb4_turkish_ci:土耳其语的大小写不敏感排序规则,适用于土耳其语文本的比较和排序。
  • utf8mb4_unicode_520_ci:Unicode 5.20版本的大小写不敏感排序规则,适用于支持 Unicode 5.20字符集的文本比较和排序。
  • utf8mb4_unicode_ci:Unicode的大小写不敏感排序规则,适用于支持Unicode字符集的文本比较和排序。
  • utf8mb4_vietnamese_ci:越南语的大小写不敏感排序规则,适用于越南语文本的比较和排序。

比较常用的应该就是以下4个

  • utf8mb4_general_ci: 不区分大小写,一般用于一般文本比较,适合非敏感数据。
  • utf8mb4_unicode_ci: 不区分大小写,支持多语言,适合需要多语言支持的应用。
  • utf8mb4_bin: 区分大小写,按照二进制顺序比较,适合敏感数据比较。

选择排序规则的考虑因素:

  1. 大小写敏感性
    • _ci(Case Insensitive):不区分大小写。
    • _cs(Case Sensitive):区分大小写。 选择对大小写敏感的排序规则,如utf8mb4_bin。
  2. 多语言支持
    • _unicode_ci:提供对多语言的支持,适用于需要处理不同语言字符的场景。
  3. 排序方式
    • _ci(Case Insensitive):按照不区分大小写的方式进行排序。
    • _bin(Binary):按照二进制方式进行排序,严格按照字符的编码值进行比较。
  4. 性能考虑
    • 不同排序规则对性能有影响,一些排序规则可能比其他规则更快。
    • 选择合适的排序规则有助于优化查询性能。

实践

我们来测试下 区分大小写和不区分大小写的排序规则 查询有何不同

新建表

新建bs表 同时 name 排序规则设置为utf8mb4_general_ci 大小写不敏感

CREATE TABLE `bs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4

测试数据写入

INSERT INTO `test`.`bs` (`id`,`name`) VALUES ('1','a');
INSERT INTO `test`.`bs` (`id`,`name`) VALUES ('2','A');
INSERT INTO `test`.`bs` (`id`,`name`) VALUES ('3','aA');
INSERT INTO `test`.`bs` (`id`,`name`) VALUES ('4','Aa');
INSERT INTO `test`.`bs` (`id`,`name`) VALUES ('5','AA');
INSERT INTO `test`.`bs` (`id`,`name`) VALUES ('6','aa');

排序规则 不区分大小写 数据测试

select * from bs where name= 'A';

在这里插入图片描述

select * from bs where name= 'a';

在这里插入图片描述

select * from bs where name= 'aa';

在这里插入图片描述

select * from bs where name= 'AA';

在这里插入图片描述

select * from bs where name= 'aA';

在这里插入图片描述

select * from bs where name= 'Aa';

在这里插入图片描述

select * from bs where name LIKE '%A';

在这里插入图片描述

select * from bs where name LIKE '%a';

在这里插入图片描述

select * from bs where name= '%A%';

在这里插入图片描述

select * from bs where name= '%a%';

在这里插入图片描述

排序规则 区分大小写 数据测试

修改表name 字段为 排序规则为 utf8mb4_bin

ALTER TABLE `bs`
	MODIFY COLUMN `name` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE  utf8mb4_bin NOT NULL  ;
select * from bs where name= 'A';

在这里插入图片描述

select * from bs where name= 'a';

在这里插入图片描述

select * from bs where name= 'aa';

在这里插入图片描述

select * from bs where name= 'AA';

在这里插入图片描述

select * from bs where name= 'aA';

在这里插入图片描述

select * from bs where name= 'Aa';

在这里插入图片描述

select * from bs where name LIKE '%A';

在这里插入图片描述

select * from bs where name LIKE '%a';

在这里插入图片描述

select * from bs where name LIKE '%A%';

在这里插入图片描述

select * from bs where name LIKE '%a%';

在这里插入图片描述

总结

可以看到在排序规则区分大小写和不区分大小写 对SQL查询的结果 影响还是比较大的。

所以在选择字符集时,需要考虑使用的语言、特殊字符的需求以及数据存储的具体情况。确保所选字符集能够覆盖项目中的所有字符需求,并选择合适的排序规则以确保数据的正确比较和排序。


good day !!!

标签:ci,name,utf8mb4,bs,字符集,详解,大小写,MySQL,排序
From: https://blog.csdn.net/a15835774652/article/details/141645369

相关文章

  • 【爬虫实战】——利用bs4和sqlalchemy操作mysql数据库,实现网站多行数据表格爬取数据
    前言此篇接上一篇的内容,在其基础上爬取网站的多行表格数据,以及把数据写入到mysql数据库中目录一、定位表格查找元素二、提取数据三、写入mysql数据库四、附录一、定位表格查找元素首先打开网站,如图需要爬取多行数据的表格,利用查找元素定位,看图中分析得知我要爬取的是tr......
  • 外贸管理系统采购销售报关计算机毕业设计VUE/PYTHON/MYSQL
    开发一个基于Vue、Python和MySQL的外贸管理系统,用于处理采购、销售以及报关等业务流程。这样的系统通常涉及前端界面展示、后端逻辑处理以及数据库存储等多个部分。下面是一些关键组件的设计建议:1.技术栈选择前端:Vue.js后端:Python(Flask/Django)数据库:MySQL2.系统......
  • 【MySQL数据库管理问答题】第9章 优化查询性能
    目录1.请说明EXPLAIN语句的作用。2.为什么使用索引会比全表扫描可以提供更好的查询性能?3.MySQL数据库是如何自动维护索引统计信息的。4.mysqlcheck客户机程序都有哪些功能?5.在性能分析期间使用InvisibleIndexes有什么好处?6.什么是直方图(histograms),它在使用......
  • 【MySQL数据库管理问答题】第10章 选择备份策略
    目录1.请详细说明热备、温备和冷备的特点和不同。2.在MySQL中支持的备份类型有哪几种,分别予以说明。3.执行逻辑备份要具备哪些条件,其优缺点在哪。4.物理备份一般是用来满足什么样的数据库维护需求?5.基于快照的备份能否用来进行数据库损坏时的恢复,请说明理由。6.......
  • 【MySQL数据库管理问答题】第8章 维护稳定的系统
    目录1.请说明一个稳定的系统的具体含义。2.在确定数据库失败原因时,都要考虑哪些方面的因素?3.如何查看InnoDB表所占用的实际存储空间大小?4.谈谈对数据库进行纵向扩展和横向扩展的适用场合。5.说出在判断一个数据库性能问题时的一般性思路或步骤。6.请对InnoDB......
  • Git详解
    Git是一个分布式版本控制系统,用于跟踪代码的修改历史并协同开发。Git的基本概念包括:1.仓库(Repository):存储源代码、历史记录和元数据的地方。2.分支(Branch):将代码的不同版本分离开来,可以同时进行多个版本的开发和维护。3.提交(Commit):将修改的代码保存到仓库中,并附带说明信......
  • 【阅己书城】docker部署MySQL及Redis
    一、MySQL1拉取mysql镜像dockerpullmysql:5.72启动mysql容器--name指定容器名字-v目录挂载-p指定端口映射-e设置mysql参数-d后台运行dockerrun--namemysql-v/mydata/mysql/data:/var/lib/mysql-v/mydata/mysql/conf:/etc/mysql-v/mydata/mysql/log:/var/......
  • MySQL写操作所加的锁
    写操作所加的锁:DELETE:对一条记录做DELETE操作的过程其实是先在B+树中定位到这条记录的位置,然后获取这条记录的X锁,然后再执行deletemark操作。UPDATE:①如果未修改该记录的键值并且被更新的列占用的存储空间在修改前后未发生变化,则先在B+树中定位到这条记录的位置,然后再获......
  • EMC/EMI详解
    EMC/EMI详解EMI(干扰)和EMS(抗扰)基础知识与整改流程EMC主要包含两大项:EMI(干扰)和EMS(产品抗干扰和敏感度)。EMI(ElectromagneticInterference),表示电磁干扰(电磁干涉、电磁妨碍)的术语。由于发射电磁波会导致干扰,所以经常与Emission(辐射、发射)这一术语成对使用。从开关电源方面讲,是指......
  • MySQL:简述对索引的认识
    一、为什么要有索引?一般的应用系统,读操作的比例远远大于写操作的比例,而且插入操作和一般的更新操作很少出现性能问题。在生产环境中,我们遇到最多的,也是最容易出现性能问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起查询优化,就不得不提到索引了。......