博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高性能的MySQL(7)字符集和校对
阅读量:6970 次
发布时间:2019-06-27

本文共 1236 字,大约阅读时间需要 4 分钟。

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

校对是指一组用于某个字符集的排序规则。

每一类编码字符都有其对应的字符集和校对规则。

一、MySQL如何使用字符集

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

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

MySQL的设置可以分为两类:

1、创建对象时的默认值

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

默认情况下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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;

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

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

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

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

转载地址:http://iwisl.baihongyu.com/

你可能感兴趣的文章
某公司git代码管理,到如何上线
查看>>
ubuntu 16.04安装mips交叉编译
查看>>
MyEclipse查看Struts2源码及Javadoc文档
查看>>
C语言基础学习day03
查看>>
js代码规范
查看>>
Algs4-2.4.24链接实现优先队列
查看>>
spring mvc 程序
查看>>
20条Linux命令面试问答
查看>>
Jmeter做并发测试(设置集合点)
查看>>
001/Nginx高可用模式下的负载均衡与动静分离(笔记)
查看>>
云服务jdk 升级为 OpenJDK11
查看>>
wp 取消button按下效果
查看>>
【差分约束】
查看>>
C#,java,C++ 等变量命名规则
查看>>
第六次实验
查看>>
python 编码问题
查看>>
进程与线程
查看>>
案例分析
查看>>
A Simple Problem with Integers(线段树入门题)
查看>>
福大软工 · 第七次作业 - 需求分析报告
查看>>