高性能的MySQL(7)字符集和校对

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

字符集是指一种从二进制编码到某类字符符号的映射,可以参考如何使用一个字节来表示英文。

校对是指一组用于某个字符集的排序规则。
每一类编码字符都有其对应的字符集和校对规则。

一、MySQL如何使用字符集

每种字符集都可能有多种校对规则,并且都有一个默认的校对规则,并且每个校对规则只是针对某个字符集,和其他的字符集么有关系。

一定要记住一点:只有基于字符集的值才真正的有字符集的概念。

MySQL的设置可以分为两类:

1、创建对象时的默认值

服务器有默认的字符集和校对规则,数据也有自己的默认值,每个表也有自己的默认值,这个是一个继承的默认设置,最终靠底层的默认设置来影响你创建的对象。

默认情况下:

创建数据库的时候,将根据服务器上的character_set_server设置来设定该数据库的默认字符集。

创建表的时候,根据数据库的设置指定表的字符设置。

创建列的时候,根据表的设置指定列的字符集设置。

只有创建列没有为列指定字符集的时候,表的默认才有用。

2、服务器和客户端通信时的设置。

客户端和服务端通信的时候,可能使用不同的字符集,这时服务器端将必须进行必要的转化。

182830348.png如果使用latin1打开了一个连接,并使用set names utf8来告诉服务器客户端使用utf-8来传输数据,可能会导致一些错误。应该先设置客户端字符集,在PHP中使用mysql_set_charset()来修改客户端的字符集。


二、MySQL如何比较2个字符串的大小

如果比较2个字符串的字符集不同,MySQL会先将其转成同一个字符集再进行比较,如果2个字符集不兼容,则会出错。

Mysql5.0以后的版本会做隐式转换。还可以使用前缀和collate子句来指定字符串的字符集和校对字符集。

这里有一个通用原则可以供我们使用:

先为服务器或者数据库选择一个合理的字符集,然后根据不同的实际情况,让某个列选择自己的字符集

三、字符集和校对规则会影响查询

不同的字符集和校对规则之间的转换会带来额外的开销,下面看一个例子:

1
2
3
4
5
6
CREATE  TABLE  `actor` (
   `id`  int (11)  NOT  NULL ,
   `title`  varchar (10)  NOT  NULL ,
   ` year date  NOT  NULL ,
   KEY  `title` (`title`)
) ENGINE=InnoDB  DEFAULT  CHARSET=utf8;

只有排序查询要求的字符集和服务器的字符集相同的时候,才能使用索引排序,否则只能使用文件排序了。

185928130.png

UTF-8是我们最常用的一个字符集,它存储一个字符使用3个字节,但是英文字符仍然占用一个字节。例如,一个编码是UTF-8的char(10)需要30个字节

另一个“坑”就是如果要索引一个UTF-8字符集的列,MySQL会假设每一个字符集都是三个字节,这样最长索引前缀的限制就缩短到了原来的三分之一了。比如:

191523899.png

无形中变成了前缀索引,就不能使用覆盖索引了。





















本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1317900,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 存储
【MySQL】——数据类型及字符集
【MySQL】——数据类型及字符集
165 0
【MySQL】——数据类型及字符集
|
1月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
|
1月前
|
存储 人工智能 关系型数据库
详细介绍TiDB 与 MySQL 中的常用字符集及排序规则
一文理清 TiDB 与 MySQL 中的常用字符集及排序规则
115 6
|
2天前
|
存储 运维 关系型数据库
高性能 MySQL 第四版(GPT 重译)(四)(2)
高性能 MySQL 第四版(GPT 重译)(四)
|
2天前
|
存储 缓存 关系型数据库
高性能 MySQL 第四版(GPT 重译)(三)(1)
高性能 MySQL 第四版(GPT 重译)(三)
|
2月前
|
存储 关系型数据库 MySQL
【2024】新建mysql数据库,如何选择字符集和排序规则
【2024】新建mysql数据库,如何选择字符集和排序规则
147 1
|
2月前
|
存储 关系型数据库 MySQL
从零开始学Mysql - 字符集和编码(下)
从零开始学Mysql - 字符集和编码(下)
108 0
|
2月前
|
存储 SQL 关系型数据库
从零开始学Mysql - 字符集和编码(上)
从零开始学Mysql - 字符集和编码(上)
137 0
|
2月前
|
存储 关系型数据库 MySQL
《高性能Mysql》学习笔记(二)
《高性能Mysql》学习笔记(二)
136 0
|
2月前
|
存储 SQL 关系型数据库
《高性能Mysql》学习笔记(一)
《高性能Mysql》学习笔记(一)
94 0