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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

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

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

一、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,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
8月前
|
消息中间件 缓存 弹性计算
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
341 11
|
3月前
|
SQL 关系型数据库 MySQL
索引设计实战:如何创建高性能MySQL索引
本文深入解析MySQL索引设计的核心原则与实战技巧,涵盖索引选择性、复合索引、性能优化及常见陷阱等内容,通过实际案例帮助开发者创建高效索引,显著提升数据库查询速度,助你打造高性能数据库系统。
|
7月前
|
存储 关系型数据库 MySQL
【免费动手教程上线】阿里云RDS MySQL推出大容量高性能存储:高性能本地盘(最高16TB存储空间)、高性能云盘(最高64TB存储空间)
阿里云RDS MySQL提供高性能本地盘与高性能云盘等存储方案,满足用户大容量、低延迟需求。高性能本地盘单盘最大16TB,IO延时微秒级;高性能云盘兼容ESSD特性,支持IO性能突发、BPE及16K原子写等能力。此外,阿里云还提供免费动手体验教程,帮助用户直观感受云数据库 RDS 存储性能表现。
|
8月前
|
关系型数据库 MySQL Linux
CentOS 7系统下详细安装MySQL 5.7的步骤:包括密码配置、字符集配置、远程连接配置
以上就是在CentOS 7系统下安装MySQL 5.7的详细步骤。希望这个指南能帮助你顺利完成安装。
2128 26
|
11月前
|
存储 人工智能 搜索推荐
详解MySQL字符集和Collation
MySQL支持了很多Charset与Collation,并且允许用户在连接、Server、库、表、列、字面量多个层次上进行精细化配置,这有时会让用户眼花缭乱。本文对相关概念、语法、系统变量、影响范围都进行了详细介绍,并且列举了有可能让字符串发生字符集转换的情况,以及来自不同字符集的字符串进行比较等操作时遵循的规则。对于最常用的基于Unicode的字符集,本文介绍了Unicode标准与MySQL中各个字符集的关系,尤其详细介绍了当前版本(8.0.34)默认字符集utf8mb4。
2652 82
|
9月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
|
存储 人工智能 关系型数据库
MySQL 8.0 字符集与比较规则介绍
我们都知道 MySQL 8.0 与 MySQL 5.7 的区别之一就是默认字符集从 latin1 改成了 utf8mb4 ,除此之外,MySQL 8.0 下的字符集和比较规则还有没有其他变化呢?本篇文章我们一起来学习下。
929 1
|
存储 自然语言处理 关系型数据库
|
存储 关系型数据库 MySQL
MySQL各字符集、排序规则的由来、用法,区别和联系
MySQL支持多种字符集和排序规则,这些在数据库设计和数据处理中起着重要作用。下面是它们的由来、用法、区别和联系: 1. **字符集(Character Set)**: - **由来**:字符集定义了数据库中可以存储的字符集合,以及这些字符在数据库中的存储方式。 - **用法**:在创建数据库或表时,可以指定所需的字符集。常见的字符集包括UTF-8、UTF-16、Latin1等。 - **区别和联系**:不同的字符集支持不同的字符范围和存储方式,选择合适的字符集可以确保数据的正确存储和处理。例如,UTF-8支持全球范围内的大多数字符,而Latin1只支持西欧语言字符集。
372 1

推荐镜像

更多