首页 > 数据库 >《mysql高性能》系列4:字符集和校对

《mysql高性能》系列4:字符集和校对

时间:2023-05-19 23:33:47浏览次数:49  
标签:set character 字符集 mysql 校对 服务器 客户端

对于字符串类型,有一个字符集的概念在里面。字符集是指,一种从二进制编码到某类字符符号的映射。例如,中文符号,在计算机底层用二进制存储,那么,就需要有一个映射表,来表示哪个中文符号用哪个二进制编码来表示。校对,是指一组用于某个字符集的排序规则。

1 mysql如何使用字符集

只有基于字符的值才有字符集的概念。因此,对于其他类型的值,比如,int,datetime,是不需要使用到字符集来编码的。
mysql的字符集的设置可以分为两类:创建对象时的默认值、服务器和客户端通信所使用的字符集设置

1.1 创建对象时的字符集设置

mysql服务器有默认的字符集和校对规则,每个数据库也有自己的默认值,每个表也有自己的默认值。这是一个逐层继承的默认设置。例如,如果数据库的默认字符集为utf8mb4,在创建表my_table时没有指定字符集,那么,my_table的字符集将是utf8mb4。如果有指定为utf8,那么,就是指定的字符集utf8。记住:只有当用户没有指定字符集时,默认字符集才起作用。

在创建数据库、表和列时,都可以由用户自己指定字符集。

1.2 服务器和客户端通信所使用的字符集设置

服务器和客户端通信时,可能使用不同的字符集。因此,服务器必须进行“翻译”的工作:

  1. 服务器假设客户端使用character_set_client来传输数据和sql语句;
  2. 服务器收到sql语句后,将character_set_client编码的语句转化为character_set_connection编码的语句。在处理sql语句时,都使用character_set_connection。
  3. 在服务器返回结果给客户端时,将character_set_connection转化为character_set_result。

因此,若客户端连接到服务器时使用latin1字符集,服务器假设客户端使用utf8字符集,那么,这时候可能导致转化的时候出现一些错误。

2 怎样选择字符集和校对规则

在设置字符集时,最好先为服务器(或者数据库)设置一个合理的字符集。然后,根据实际情况,选择列的字符集。在一个数据库中使用不同的字符集是一件麻烦的事情,所以,一个数据库中使用一种字符集比较好。

对于校对规则,需要考虑到:

  • 是否大小写敏感
  • 是否以字符串编码的二进制来比较大小。

大小写敏感、大小写不敏感和以二进制值比较大小的校对规则的后缀分别是:_cs、_ci和_bin。如果不指定校对规则,则会以字符集默认的校对规则来比较大小。

3 字符集和校对规则如何影响查询

只有排序查询要求的字符集与服务器数据的字符集相同的时候,才能使用索引进行排序。因为,索引是根据数据列的校对规则进行排序的。例如,若列使用的是utf8_general_ci,查询排序时指定utf8_bin,那么,就没法使用索引来排序了。这个时候,需要文件排序。

标签:set,character,字符集,mysql,校对,服务器,客户端
From: https://www.cnblogs.com/phenixlife/p/17416592.html

相关文章

  • MySQL下载安装(Linux)
    Linux安装MySQL在线安装yum-yinstallmysql-server用Xshell,输入安装命令后,回车。源码安装下载源码进行编译安装、繁琐......
  • MySQL下载安装
    下载MySQL安装包登录MySQL官网:MySQL点击DOWNLOADS点击MySQLCommunity(GPL)Downloads点击MySQLCommunityServer点击Archives,选择需要的版本5.5版本及以下一般有MSI和ZIP两种。也可以下载5.7稳定版MySQLMSI版本是一种安装包,是一种微软安装程序,它支持一键安装,可......
  • MySQL
    数据库三大范式什么是范式?范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。最常用的三大范式第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。......
  • Mysql重置主键id顺序
     消除因删除而产生错乱的主键id顺序altertable  表名  dropcolumnid;altertable  表名  addidmediumint(8)notnullprimarykeyauto_incrementfirst;  ......
  • 河北王校长MySQL
    河北王校长MySQL索引b+树数据结构\数量级\存储内容b+树优势、对比哈希表\数组\b树\跳表跳表不适用磁盘存储介质、指针管理难以适应联合索引、出现时间晚hash不支持最左前缀和范围查找数组成本过高b树树型过高,io多最左前缀原则索引覆盖索引下推扩充showindex命......
  • jsp页面连接mysql数据库报错“com.mysql.jdbc.Driver”
    今天在做web实验的时候数据库突然连不上了以下是报错我用的mysql包为mysql-connector-java:5.1.47找了好久后来在一篇博客的启发下,那篇博客中说把一般包为web下lib目录中后来我仔细观察,发现我添加的包在WEBINF目录下的classes下的lib中,难怪找不到我把它移动到外面就可以了......
  • mysql按顺序递增(出现不连续问题)
    问题在表中添加新记录时,自动递增不连续(之前出现过了473,之后删除473,再插入新纪录,新纪录的id是474,我想让他的id为8)(用springboot+mybatis-plus插入新纪录)解决第一步1.如果是InnoDB引擎:将该字段先取消“自动递增”,去掉“不是null”的对勾,取消“主键”,并保存。如下图设置:第二......
  • .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移
    前言接上期文章《.NET6项目连接数据库方式方法》,有人问了我几个问题,现在就这几个问题,拓展延申一下创建实体类、数据库。把ORM框架和数据迁移都写进去。安装ORM框架,这里我们采用EFCore安装EFCore我的项目是在Linux上创建的,使用的是vscode开发工具远程开发。为了方便大家阅读和......
  • MySQL 插入数据
    MySQL插入数据MySQL表中使用INSERTINTOSQL语句来插入数据。你可以通过mysql>命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据。语法以下为向MySQL数据表插入数据通用的INSERTINTO SQL语法:INSERTINTOtable_name(field1,field2,...fieldN)......
  • mybatis plus实体类中字段映射mysql中的json格式方式
    packagecom.example.springbootstudy.entity;importcom.baomidou.mybatisplus.annotation.TableField;importcom.baomidou.mybatisplus.annotation.TableId;importcom.baomidou.mybatisplus.annotation.TableName;importcom.baomidou.mybatisplus.extension.handlers.Fas......