【MySQL基础】字符集与校对集详解

2023-12-30 15:30

本文主要是介绍【MySQL基础】字符集与校对集详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

序号系列文章
1【MySQL基础】MySQL介绍及安装
2【MySQL基础】MySQL基本操作详解
3【MySQL基础】MySQL基本数据类型
4【MySQL基础】MySQL表的七大约束

文章目录

  • 前言
  • 字符集与校对集
  • 1,字符集与校对集的概述
    • 1.1,字符集
    • 1.2,校对集
  • 2,字符集和校对集的设置
    • 2.1,MySQL环境
    • 2.2,数据库
    • 2.3,数据表
    • 2.4,字段
  • 结语


前言

大家好,我是小杨!今天我将详细的为大家介绍MySQL中的字符集与校对集的相关知识,希望大家能够从中收获多多!


字符集与校对集

1,字符集与校对集的概述

1.1,字符集

1,字符集的含义

字符指计算机中保存的各种文字和符号,包括各种国家的文字、标点符号、图形、符号、数字等。

由于计算机采用的是二进制保存数据,用户输入的字符将会按照一定的规则转化为二进制后保存,这个过程就是字符编码。

将一系列的字符的编码规则组合起来,就形成了字符集,用于表示特定的文本信息。

2,常见的字符集

在计算机的发展历史中,出现了许多的字符集,MySQL也提供了各种各样的字符集的支持。

常用的字符集有以下几种:

字符集单字符最大长度支持的语言
latinl1字节西欧字符,希腊字符等
gbk2字节简体和繁体中文,日文,韩文等
utf83字节世界上大部分国家的文字
utf8mb44字节支持几乎所有的语言

注意事项:

  1. 单字符占用的存储空间越多,所支持的语言种类就越多。
  2. 表中的字符集均向下兼容ASCII(美国信息交换标准代码),如果输入的字符在ASCII的范围内,则编码结果是相同的。
  3. MySQL中的utf8编码和标准的UTF-8之间存在差异,标准的UTF-8中的一个字符最多占用4个字节,而utf8的最多占用3个字节。
  4. utf8的单字符占用最大字节数少于UTF-8的,进而导致出现UTF-8中的一些特殊字符(表情)在MySQL的utf8编码中无法使用的情况
  5. utf8mb4编码的引进解决了上述问题,utf8mb4表示 Unicode 的所有字符,包括表情符号和一些较少使用的字符。

3,查看MySQL中的字符集

MySQL中提供了挺多的字符集的支持,查看MySQL中可用字符集基本语法如下:

SHOW CHARACTER SET;

操作结果如下:

image-20230106222957102

操作结果分析:

Charset:字符集名称

Description:描述信息

Default collation:默认校对集

Maxlen:单字符的最大长度


1.2,校对集

1,校对集的含义

校对集是数据比较的规则,用于为不同的字符集指定比较和排序规则。

校对集依赖字符集,每个字符集有多种校对规则。


2,校对集名称的构成

latinl字符集对应的校对集为latinl_swedish_ci

  • 校对集的名称由_分隔的三部分组成的。
  • 开头的latinl表示对应的字符集。
  • 中间的swedish表示国家名或者使用general。
  • 结尾的是ci,cs或bin,ci表示不区分大小写,cs表示区分大小写,bin表示以二进制的方式比较。

3,校对集的查看

MySQL也提供了许多的字符集,查看MySQL中可用校对集基本语法如下:

SHOW COLLATION;

操作结果如下:

image-20230106223159803

操作结果分析:

Collatioin:校对集名称

Charset:对应的字符集

Id:校对集ID

default:是否为对应字符集的默认校对集

Compiled:是否已编译

Sortlen:排序的内存需求量


2,字符集和校对集的设置

MySQL 的字符集和校对规则有 4 个级别的默认设置,即服务器级、数据库级、表级和字段级。

它们分别在不同的地方设置,作用也不相同。

2.1,MySQL环境

1,当前会话使用的字符集查看

SHOW VARIABLES LIKE 'CHARACTER%';

操作结果如下:

image-20230106223410098

操作结果说明:

  1. 上述结果是显示当前会话使用的字符集,在不同的客户端环境中的输出结果可能不相同。
  2. 不同的客户端可以指定不同的字符集环境配置,服务器会按照不同的字符集环境配置进行处理。
  3. 会话是指从客户端登录服务器,直到退出服务器的整个过程,可以依次打开多个客户端进行操作,进而产生不同的会话。
  4. 如果没有指定服务器字符集,MySQL 会默认使用 latin1 作为服务器字符集。如果只指定了字符集,没有指定校对规则,MySQL 会使用该字符集对应的默认校对规则。如果要使用字符集的非默认校对规则,需要在指定字符集的同时指定校对规则。

2,MySQL环境与字符集相关的变量

变量名含义
character_set_client客户端字符集
character_set_connection客户端与服务器连接使用的字符集
character_set_database默认数据库使用的字符集
character_set_filesystem文件系统字符集
character_set_results将查询结果()返回给客户端的字符集
character_set_server服务器默认字符集
character_set_system服务器用来存储标识符的字符集
character_sets_dir安装字符集的目录

注意事项说明:

  1. character_set_client,character_set_connection,character_set_results,character_set_server这4个变量是重点,需特别注意。
  2. character_set_server决定了新创建的数据表默认使用的字符集,character_set_client对应的是客户端的字符集,character_set_connection对应的是连接层的字符集,character_set_results对应的是查询结果的字符集。
  3. 数据库的字符集决定了数据表的默认字符集,数据表的字符集决定了字段的默认字符集。
  4. character_set_client,character_set_connection,character_set_results这三个变量的值在一般情况下是相同的,具体值是由客户端的编码决定的,进而使客户端的输入字符和输出的查询结果不会出现乱码情况。

3,字符集变量的设置更改

set 变量名 = 值;

操作实例:

set character_set_client = gbk;
set character_set_connecction = gbk;
set character_set_results = gbk;

4,注意事项说明:

  1. 上述3个变量的更改在MySQL中还可以使用set names 字符集; 直接进行修改,即set names gbk;
  2. 使用setset names修改字符集只对当前会话有效,不会对其它的会话产生影响,且会话结束后,下次的会话仍然使用默认值。
  3. character_set_connection,character_set_database,character_set_server对应的校对集分别通过变量collation_connection,collation_database,collation_server来指定。
  4. 若字段使用utf8字符集,而客户端使用gbk字符集。MySQL会自动进行编码转换。
  5. 由于utf8和gbk这两种字符集本质上是不同的,虽然常见字符可以转换成功,但遇到其中一个字符集中没有对应的特殊字符,则就会出现转换失败,进而导致乱码的情况。

2.2,数据库

数据库的字符集和校对集既可以在创建数据库时指定,也可以在创建完数据库后通过 ALTER DATABASE 命令进行修改。

1,创建数据库时设定字符集和校对集

#既未指定字符集,又未指定校对集
CREATE DATABASE 库名称;#仅指定字符集,未指定校对集
CREATE DATABASE 库名称 CHARACTER SET [=] charset_name;#仅指定校对集,未指定字符集
CREATE DATABASE 库名称 COLLATE [=] collation_name;#既指定字符集,又指定校对集
CREATE DATABASE 库名称 CHARACTER SET [=] charset_name COLLATE [=] collation_name;

知识点:

  1. CHARACTER SET用于指定字符集,COLLATE用于指定校对集。

  2. 字符集和校对集的设定规则:

    • 若指定字符集,又指定校对集,表示数据库使用指定的字符集和校对集。

    • 若仅指定字符集,未指定校对集,表示数据库使用该字符集的默认校对集。

    • 若仅指定校对集,未指定字符集,表示数据库使用该校对集对应的字符集。

    • 若未指定字符集,又未指定校对集,表示数据库使用服务器字符集和校对集作为数据库的字符集和校对规则。

  3. 为了避免受到默认值的影响,推荐在创建数据库时指定字符集和校对集。


操作实例:

创建数据库mydb_1,指定字符集为utf8,使用默认校对集utf8_genral_ci的示例语句:

create database mydb_1 character set utf8;

image-20230107230126954


2,修改数据库的字符集和校对集

如果您在创建完数据库后想进行修改它的字符集或校对集,可以使用 ALTER DATABASE 语句。

#对数据库的字符集单独进行修改
ALTER DATABASE 库名称 CHARACTER SET [=] charset_name;#对数据库的校对集单独进行修改
ALTER DATABASE 库名称 COLLATE [=] collation_name;#对数据库的字符集和校对集进行修改
ALTER DATABASE 库名称 CHARACTER SET [=] charset_name COLLATE [=] collation_name;

操作实例:

将 mydb_1数据库的字符集修改为 latin1,校对规则修改为 latin1_general_ci 的示例语句:

ALTER DATABASE mydb_1 CHARACTER SET latin1 COLLATE latin1_general_ci;

image-20230107230739198

需要注意的是,如果数据库里已经存在数据表,修改字符集后,已有的数据表不会按照新的字符集重新存放,所以不能通过修改数据库的字符集来修改数据表的内容。


3,查看数据库的字符集和校对集

#第一步:进入操作库
use 库名称;#第二步:查看操作库的创建信息
SHOW CREATE DATABASE 库名称 \G;

image-20230107224436689


2.3,数据表

数据表的字符集和校对集在创建表的时候指定,也可以在创建完表后通过 ALTER TABLE 命令进行修改。

1,创建数据表时设定字符集和校对集

#既未指定字符集,又未指定校对集
CREATE TABLE 表名称 (字段名 字段类型...);#仅指定字符集,未指定校对集
CREATE TABLE 表名称 (字段名 字段类型...) CHARACTER SET [=] charset_name;#仅指定校对集,未指定字符集
CREATE TABLE 表名称 (字段名 字段类型...) COLLATE [=] collation_name;#既指定字符集,又指定校对集
CREATE TABLE 表名称 (字段名 字段类型...) CHARACTER SET [=] charset_name COLLATE [=] collation_name;

知识点:

  1. CHARACTER SET可简写为CHARSET。

  2. 设置表的字符集及校对集和设置数据库字符集的规则基本类似:

    • 若指定字符集,又指定校对集,表示数据表使用指定的字符集和校对集。

    • 若仅指定字符集,未指定校对集,表示数据表使用该字符集的默认校对集。

    • 若仅指定校对集,未指定字符集,表示数据表使用该校对集对应的字符集。

    • 若未指定字符集,又未指定校对集,表示数据表使用数据库字符集和校对集作为数据表的字符集和校对规则。

  3. 为了避免受到默认值的影响,推荐在创建数据表时指定字符集和校对集。

操作实例:

在数据库mydb_1中创建数据表demo1,指定字符集为utf8,使用默认校对集utf8_genral_ci的示例语句:

create table demo1(
id int,
name varchar(15)
)character set utf8;

image-20230107231446838


2,修改数据表的字符集和校对集

如果您在创建完数据库后想进行修改它的字符集或校对集,可以使用 ALTER tables 语句。

#对数据库的字符集单独进行修改
ALTER TABLE 表名称 CHARACTER SET [=] charset_name;#对数据库的校对集单独进行修改
ALTER TABLE 表名称 COLLATE [=] collation_name;#对数据库的字符集和校对集进行修改
ALTER TABLE 表名称 CHARACTER SET [=] charset_name COLLATE [=] collation_name;

操作实例:

将数据表demo1的字符集修改为 latin1,校对集修改为 latin1_general_ci 的示例语句:

alter table demo1 character set latin1 collate latin1_general_ci;

image-20230108000037988


3,查看数据表的字符集和校对集

SHOW CREATE TABLE 表名称 \G;

image-20230107232322511


2.4,字段

字段的字符集和校对集在创建表的时候指定,也可以在创建完表后通过 ALTER TABLE 命令进行修改

1,创建字段时设定字符集和校对集

#既未指定字符集,又未指定校对集
CREATE TABLE 表名称 (字段名1 字段类型 ...);#仅指定字符集,未指定校对集
CREATE TABLE 表名称 (字段名1 字段类型 CHARACTER SET [=] charset_name, ...);#仅指定校对集,未指定字符集
CREATE TABLE 表名称 (字段名1 字段类型 COLLATE [=] collation_name, ...);#既指定字符集,又指定校对集
CREATE TABLE 表名称 (字段名1 字段类型 CHARACTER SET [=] charset_name COLLATE [=] collation_name, ...);

操作实例:

在数据库mydb_1中创建数据表demo2,指定字段name的字符集为utf8,使用默认校对集utf8_genral_ci的示例语句:

create table demo2(
name varchar(15) character set utf8);

image-20230107233240988


2,修改数据库的字符集和校对集

如果您在创建完数据库后想进行修改它的字符集或校对集,可以使用 ALTER DATABASE 语句,语法格式如下:

ALTER TABLE 表名称 MODIFY 字段名 数据类型 [CHARACTER SET charset_name][COLLATE collation_name];

操作实例:

将数据表demo2里的name字段的字符集修改为utf8,使用默认校对集utf8_genral_ci 的示例语句:

alter table demo2 modify name varchar(15) character set utf8;

image-20230107235539619

注意:如果在创建字段的时候没有特别指定字符集和校对规则,默认使用数据表的字符集和校对规则。


3,查看数据表的字符集和校对集

SHOW CREATE TABLE 表名称 \G;

操作实例:

image-20230107234126750


结语

这就是本期博客的全部内容啦,想必大家已经对MySQL中的字符集和校对集的相关知识有了全新地认识和理解吧,如果有什么其他的问题无法自己解决,可以在评论区留言哦!

最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!
在这里插入图片描述


这篇关于【MySQL基础】字符集与校对集详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/553270

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)