MySQL数据库——MySQL字符集和校对规则详解

news2024/9/22 15:31:36

在讲解字符集和校对规则之前,我们先来简单了解一下字符、字符集和字符编码。

字符(Character)是计算机中字母、数字、符号的统称,一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等。

计算机是以二进制的形式来存储数据的。平时我们在显示器上看到的数字、英文、标点符号、汉字等字符都是二进制数转换之后的结果。

字符集(Character set)定义了字符和二进制的对应关系,为字符分配了唯一的编号。常见的字符集有 ASCII、GBK、IOS-8859-1 等。

字符编码(Character encoding)也可以称为字集码,规定了如何将字符的编号存储到计算机中。

大部分字符集都只对应一种字符编码,例如:ASCII、IOS-8859-1、GB2312、GBK,都是既表示了字符集又表示了对应的字符编码。所以一般情况下,可以将两者视为同义词。Unicode 字符集除外,Unicode 有三种编码方案,即 UTF-8、UTF-16 和 UTF-32。最为常用的是 UTF-8 编码。

校对规则(Collation)也可以称为排序规则,是指在同一个字符集内字符之间的比较规则。字符集和校对规则是一对多的关系,每个字符集都有一个默认的校对规则。字符集和校对规则相辅相成,相互依赖关联。

简单来说,字符集用来定义 MySQL 存储字符串的方式,校对规则用来定义 MySQL 比较字符串的方式。

有些数据库并没有清晰的区分开字符集和校对规则。例如,在 SQL Server 中创建数据库时,选择字符集就相当于选定了字符集和校对规则。

而在 MySQL 中,字符集和校对规则是区分开的,必须设置字符集和校对规则。一般情况下,没有特殊需求,只设置其一即可。只设置字符集时,MySQL 会将校对规则设置为字符集中对应的默认校对规则。

可以通过SHOW VARIABLES LIKE 'character%';命令查看当前 MySQL 使用的字符集,命令和运行结果如下:

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | gbk                                                     |
| character_set_connection | gbk                                                     |
| character_set_database   | latin1                                                  |
| character_set_filesystem | binary                                                  |
| character_set_results    | gbk                                                     |
| character_set_server     | latin1                                                  |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.01 sec)

上述运行结果说明如下表所示:

名称说明
character_set_clientMySQL 客户端使用的字符集
character_set_connection连接数据库时使用的字符集
character_set_database创建数据库使用的字符集
character_set_filesystemMySQL 服务器文件系统使用的字符集,默认值为 binary,不做任何转换
character_set_results数据库给客户端返回数据时使用的字符集
character_set_serverMySQL 服务器使用的字符集,建议由系统自己管理,不要人为定义
character_set_system数据库系统使用的字符集,默认值为 utf8,不需要设置
character_sets_dir字符集的安装目录

乱码时,不需要关心 character_set_filesystem、character_set_system 和 character_sets_dir 这 3 个系统变量,它们不会影响乱码 。

可以通过SHOW VARIABLES LIKE 'collation\_%';命令查看当前 MySQL 使用的校对规则,命令和运行结果如下:

mysql> SHOW VARIABLES LIKE 'collation\_%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | gbk_chinese_ci    |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set, 1 warning (0.01 sec)

对上述运行结果说明如下:

  • collation_connection:连接数据库时使用的校对规则
  • collation_database:创建数据库时使用的校对规则
  • collation_server:MySQL 服务器使用的校对规则

校对规则命令约定如下:

  • 以校对规则所对应的字符集名开头
  • 以国家名居中(或以 general 居中)
  • 以 ci、cs 或 bin 结尾,ci 表示大小写不敏感,cs 表示大小写敏感,bin 表示按二进制编码值比较。

MySQL字符集的转换过程

MySQL 中字符集的转换过程如下:

1)在命令提示符窗口(cmd 命令行)中执行 MySQL 命令或 sql 语句时,这些命令或语句从“命令提示符窗口字符集”转换为“character_set_client”定义的字符集。

2)使用命令提示符窗口成功连接 MySQL 服务器后,就建立了一条“数据通信链路”,MySQL 命令或 sql 语句沿着“数据链路”传向 MySQL 服务器,由 character_set_client 定义的字符集转换为 character_set_connection 定义的字符集。

3)MySQL 服务实例收到数据通信链路中的 MySQL 命令或 sql 语句后,将 MySQL 命令或 sql 语句从 character_set_connection 定义的字符集转换为 character_set_server 定义的字符集。

4)若 MySQL 命令或 sql 语句针对于某个数据库进行操作,此时将 MySQL 命令或 sql 语句从 character_set_server 定义的字符集转换为 character_set_database 定义的字符集。

5)MySQL 命令或 sql 语句执行结束后,将执行结果设置为 character_set_results 定义的字符集。

6)执行结果沿着打开的数据通信链路原路返回,将执行结果从 character_set_results 定义的字符集转换为 character_set_client 定义的字符集,最终转换为命令提示符窗口字符集,显示到命令提示符窗口中。

 黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535790.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML处理控件Aspose.Html 功能演示:将 URL 转换为 PDF

Aspose.Html for .NET 是一种高级的HTML操作API,可让您直接在.NET应用程序中执行广泛的HTML操作任务,Aspose.Html for .NET允许创建,加载,编辑或转换(X)HTML文档,而无需额外的软件或工具。API还…

如何通过SOLIDWORKS driveworksxpress初步实现参数化设计

当提到参数化设计,我们首先需要了解究竟什么是参数化设计,它是指从一个系统的角度,计划所有的设计过程,在整个系统中建立组件、次组件和子零件之间的关系,在最上层的部分建立设计意图,并将其往较下层的部分…

软件设计师 程序设计语言笔记

解释编译程序翻译阶段背诵 C 语义分析背诵 正规式题背诵 **星号表示闭包:出现0次或者多次 星号一般是就近原则,左边最近的第一个 星号你可以自定义数 1旁边没有闭包符号所以控制不到1所以这题选b 有限自动机 第一位和最后一位都必须是0 a这里的&…

jenkins 进行 gitlab, maven ,nodejs 配置

文章目录 一 . gitlab配置1. 安装gitlab插件 并进行配置2. 配置gitlab 二 maven配置一 安装maven插件二 进行maven环境配置 nodejs配置一 安装nodejs插件二 进行nodejs配置 一 . gitlab配置 1. 安装gitlab插件 并进行配置 登录gitlab进入token信息获取页面 输入名称, 选择api…

ABAP 集成钉钉开放平台

SAP->钉钉审批集成流程图 钉钉开放平台下载证书 进入钉钉开放平台,找到钉钉被调用api的域名 钉钉获取应用token官方文档 请求方法处可以找到域名,直接通过域名访问api地址下载证书 域名:api.dingtalk.com 访问域名获取证书信息 有三层…

C++显式,默认拷贝构造函数的特征以及使用

文章目录 前言一、拷贝构造函数特征二、默认拷贝构造函数(编译器生成) 前言 C规定: 1.内置类型传参直接拷贝。 2.自定义类型传参要进行拷贝构造完成拷贝 拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般…

ofo小黄车创始人赴美创业,他还欠你押金不?

ofo创始人近期又去美丽国创业去了,开始搞冰镇珍珠咖啡的生意去了,做为普通大众吃瓜的我,不禁想到,不是还欠了那么多钱呢,又开始创业了?钱从哪里来的?创业真的是想创就创?咋我还是苦哈…

ChatGPT实现旅行安排

工作之余,出门旅行一趟放松放松身心,是对自己辛勤工作最好的犒劳方式之一。旅行可以近郊游、可以远游,可以穷游,可以自驾游,可以一言不合打飞的喂鸽子,方式多种多样。但是多数情况,我们是到一个…

[Golang] 管理日志信息就用Zap包

😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:算法学习 &am…

数字图像处理【9】频域应用—快速傅里叶和二维变换

第一篇我们系统的介绍了傅里叶级数、傅里叶变换、离散傅里叶变换。本篇介绍快速傅里叶变换,并说说傅里叶变换在二维图像上是如何应用的。 首先我们快速的回顾一下第一篇内容,伟大的法国数学家、物理学家——让巴普蒂斯约瑟夫傅里叶,发现了周…

【Spark编程基础】第7章 Structured Streaming

系列文章目录 文章目录 系列文章目录前言第7章 Structured Streaming7.1 概述7.1.1 基本概念7.1.2 两种处理模型7.1.3 Structured Streaming 和 Spark SQL、Spark Streaming 关系 7.2 编写Structured Streaming程序的基本步骤7.3 输入源7.3.1 File源7.3.2 Kafka源7.3.3 Socket源…

开发框架Furion之WebApi+SqlSugar (一)

目录 1.开发环境 2.项目创建 2.1创建WebApi主项目 2.2 创建Start类库 2.3创建Model实体类库 2.4创建Application仓储业务类库 2.5创建Unility通用方法类库 3.基础功能配置 3.1 Model实体对象与数据表映射 3.2 基类仓储及动态Api接口配置 3.3 数据库IOC注册 3.4 Star…

Java字符串知多少:String、StringBuffer、StringBuilder

一、String 1、简介 String 是 Java 中使用得最频繁的一个类了,不管是作为开发者的业务使用,还是一些系统级别的字符使用, String 都发挥着重要的作用。String 是不可变的、final的,不能被继承,且 Java 在运行时也保…

【C++】哈希表-开散列闭散列

文章目录 哈希概念例子: 哈希冲突哈希函数哈希冲突解决方法1:闭散列 哈希表的闭散列实现闭散列结构设计**哈希表的插入过程:****哈希表的查找过程:**哈希表的删除过程:只能存储key为整形的元素 那其他类型怎么解决 CloseHash.h哈希表的开散列实现开散列概念开散列的最坏情况及解…

车机CarLauncher的Activity多屏模式WindowingMode为WINDOWING_MODE_MULTI_WINDOW疑问解析

hi,粉丝朋友们! IntDef(prefix { "WINDOWING_MODE_" }, value {WINDOWING_MODE_UNDEFINED,WINDOWING_MODE_FULLSCREEN,WINDOWING_MODE_MULTI_WINDOW,WINDOWING_MODE_PINNED,WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,WINDOWING_MODE_SPLIT_SCREE…

nacos注册中心源码分析一之服务注册、服务心跳

源码分析 nacos客户端注册分析 依赖包 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>Nacos的客户端是基于SpringBoot的自动装配实现的 看下依…

算法性能分析

一、时间复杂度分析 1.什么是时间复杂度 时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间。我们在软件开发中&#xff0c;时间复杂度就是用来方便开发者估算出程序运行的答题时间。 那么该如何估计程序运行时间呢&#xff0c;通常会估算算法的操作单元数量来代表…

10个顶级AI艺术生成器

人工智能 (AI) 不仅影响商业和医疗保健等行业。 通过开创人工智能生成艺术的新时代&#xff0c;它还在创意产业中发挥着越来越重要的作用。 人工智能技术和工具通常可供任何人广泛使用&#xff0c;这有助于创造全新一代的艺术家。 我们经常听说人工智能将自动化或接管所有人类…

Java中的正则表达式详解

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/java-tutorial 】或者【AIShareLab】回复 java 也可获取。 文章目录 正则表达式为什么要学习正则表达式再提出几个问题解决之道-正则表达式正则表达式基本介绍介绍 正则表达式底层实现实例分析 正则…

Word控件Aspose.Words教程:设置图表数据标签的默认选项

Aspose.Words是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理&#xff0c;并…