MySQL 字符集和校对
字符集是指一种从二进制编码到某类字符符号的映射,校对是一组用于某个字符集的排序规则。每一类编码字符都有其对应的字符集和校对规则
MySQL 如何使用字符集
每种字符集都可能有多种校对规则,并且都有一个默认的校对规则。每个校对规则都是针对某个特定的字符集的,和其他的字符集都没有关系。校对规则和字符集总是一起使用的,我们也将这样的组合统称为一个字符集。
MySQL的设置可以分为两类:创建对象时的默认值、在服务器和客户端通信时的设置。
创建对象时的默认值
MySQL服务器有默认的字符集和校对规则,每个数据库、数据表也有自己的默认值。这是一个逐层继承的默认设置,最终最靠底层的默认设置将影响我们创建的对象。这些默认值,从上而下地告诉MySQL应该使用什么字符集来存储某个列。
在这个阶梯的每一层,你都可以指定一个特定的字符集或者让服务器使用它的默认值:
- 在创建数据库的时候,将根据服务器上的 character_set_server 设置来设定该数据库的默认字符集
- 创建表的时候,将根据数据库的字符集设置指定这个表的字符集设置
- 创建列的时候,将根据表的设置指定列的字符集设置
需要注意的是: 真正存放数据的是列,所以更高“阶梯”的设置只是指定默认值。一个表的默认字符集设置无法影响存储在这个表中某个列的值。只有当创建列而没有列指定字符集的时候,如果没有指定字符集,表的默认字符集才有作用。
服务器和客户端通信时的设置
当服务器和客户端通信的时候,他们可能使用不同的字符集。这时,服务器端将进行必要的翻译转换工作,如图所示:
根据需要,可以使用 SET NAMES 或者 SET CHARACTER SET 语句来改变上面的设置。不过在服务器上使用这个命令只会改变服务器端的设置。客户端程序和客户端的API也需要使用正确的字符集才能避免在通信时出现问题。
选择字符集和校对规则
在一个数据库中使用多个不同的字符集是一件很让人头疼的事情,字符集之间不兼容问题会很难缠。有时候一切看起来很正常,但是当某个特殊字符出现的时候,所有类型的操作可能都无法进行。
正确的方法是,最好先为服务器(或者数据库) 选择一个合理的字符集。然后根据不同的实际情况,让某些列选择合适的字符集。
下面展示了在创建数据库、表、列的时候如何显式地指定字符集和校对规则:
CREATE DATABASE d CHARSET latin1;
CREATE TABLE d.t(
col1 CHAR(1),
col2 CHAR(1) CHARSET utf8,
col3 CHAR(1) COLLATE latin1_bin
)DEFAULT CHARSET=cp1251;
这个表最后的字符集和校对规则如下:
Field | Type | Collation |
---|---|---|
col1 | char(1) | cp1251_general_ci |
col2 | char(!) | utf8_general_ci |
col3 | char(!) | latin1_bin |
字符集和校对规则如何影响查询
某些字符集和校对规则可能会需要更多的CPU操作,可能会消耗更多的内存和存储空间,甚至还会影响索引的正常操作。
只有在排序查询要求的字符集和服务器数据的字符集相同的时候,才能使用索引进行排序。索引根据数据列的校对规则进行排序。如果希望使用别的校对规则进行排序,那么MySQL就需要使用文件排序。
MySQL 字符集和校对的更多相关文章
- mysql字符集和校对规则(Mysql校对集)
字符集的概念大家都清楚,校对规则很多人不了解,一般数据库开发中也用不到这个概念,mysql在这方便貌似很先进,大概介绍一下简要说明 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于比 ...
- mysql中的字符集和校对规则(mysql校对集)
1.简要说明介绍 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于比较字符的一套规则. MySql在collation提供较强的支持,oracel在这方面没查到相应的资料. 不同字符 ...
- mysql中字符集和校对规则
首先,明确一下字符集和校对规则的概念: 字符集(charset):是一套符号和编码 校对规则(collation):是在字符集内用于比较字符的一套规则,比如有的规则区分大小写,有的则无视 ...
- mysql创建数据库指定字符集和校对规则
mysql创建数据库的语法格式: CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] ...
- mysql中对字符集和校对规则的认识
字符集:指符号和字符编码的集合.校对规则:比较字符编码的方式.GBK2312:主要包括简体中文字符及常用符号,对于中文字符采用双字节编码的格式,也就是说一个汉字字符在存储占两个字节.GBK:包括有中. ...
- mysql概要(九)字符集和校对集
1.mysql 字符集有细致设置: 2.mysql字符处理机制是:数据库和客户端之间存在一个字符集转换器(后文简称转换器)将客户端字符编码(必须告诉服务端的)转换成一种中间编码的数据(可自定义的但保证 ...
- [MySQL] 字符集和排序方式
字符串类型 MySQL的字符串分为两大类: 1)二进制字符串:即一串字节序列,对字节的解释不涉及字符集,因此它没有字符集和排序方式的概念 2)非二进制字符串:由字符构成的序列,字符集用来解释字符串的内 ...
- mysql字符集和字符排序
mysql的字符集和字符序: 字符序:字符序(Collation)是指在同一字符集内字符之间的比较规则 一个字符序唯一对应一种字符集,但一个字符集可以对应多种字符序,其中有一个是默认字符序 ...
- mysql字符集和排序规则
1.关于字符集和排序规则所为字符集,就是用来定义字符在数据库中的编码的集合.常见的字符集有:utf8(支持中文)和AccIS(不支持中文) 数据库中的排序规则用来定义字符在进行排序和比较的时候的一种规 ...
随机推荐
- k8s实践 - 如何优雅地给kong网关配置证书和插件。
前言 从去年上半年微服务项目上线以来,一直使用kong作为微服务API网关,整个项目完全部署于k8s,一路走来,对于k8s,对于kong,经历了一个从无到有,从0到1的过程,也遇到过了一些坎坷,今天准 ...
- 【.NET异步编程系列1】:await&async语法糖让异步编程如鱼得水
前导 Asynchronous programming Model(APM)异步编程模型以BeginMethod(...) 和 EndMethod(...)结对出现. IAsyncResult Beg ...
- 深入理解OkHttp源码(一)——提交请求
本篇文章主要介绍OkHttp执行同步和异步请求的大体流程.主要流程如下图: 主要分析到getResponseWidthInterceptorChain方法,该方法为具体的根据请求获取响应部分,留着后面 ...
- angular2-7中的变化监测
最近做公司新项目用的angular7,中碰到了一个很头疼的问题在绑定对象中的数据改变时,页面视图没有跟新,需点击页面中的时间元素后才会更新.以前使用angularJs也经常碰到类似情况,这种时候一 ...
- React + TypeScript:元素引用的传递
React 中需要操作元素时,可通过 findDOMNode() 或通过 createRef() 创建对元素的引用来实现.前者官方不推荐,所以这里讨论后者及其与 TypeScript 结合时如何工作. ...
- 接口以及 LeetCode 每日一题
1 接口 1.1 接口的概念 接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心类内方法的实现细节,只是规定这批类里面必须提供某些方法.所以接口体现的是规范和实现分离的设计哲 ...
- 原创分享!SharePoint母版页修改(实战)
分享人:广州华软 极简 一. 前言 SharePoint网站创建时,便自带一份母版页,可由开发人员重新自定义一份母版页,关于如何转换成母版页,由于之前已经讲述过,此篇便不再赘述了. 若自定义母版页,你 ...
- osi参考模型(开放系统互连参考模型)
自互联网诞生以来,随着网络飞速发展,用户迫切要求能在不同体系结构的网络空间交换信息,使得不同的网络能够互联起来. 国际化标准组织(International Organization for Stan ...
- openlayers一:显示地图与鼠标地理坐标
openlayers两个好用的开源JS互动地图库之一,另一个是leaflet. openlayers的特点是是大而全,自身包含绝大多数功能,文档好看. leaflet是小而美,自身小,但支持扩展,好用 ...
- Android使用google breakpad捕获分析native cash
Android 开发高手课 课后练习(1) 一.Chapter01 崩溃 https://time.geekbang.org/column/article/70602 https://github.c ...