MySQL 字符集与比较规则

由于 MySQL 客户端与服务端之间通信时需要将字符串编码传输,所以不可避免会产生编码转换

字符集

MySQL 中 utf8 就是 utf8mb3,只使用 1~3 个字节表示字符

utf-8md4 使用 1~4 个字节表示字符

相关参数

MySQL 服务器有以下几个参数与编码有关

字符集相关参数:

character_set_server 服务器级别的字符集

character_set_database 当前数据库的字符集 (如果没有使用 USE 选择数据库,则查看服务器级别的字符集) 只读,无法通过修改改变当前数据库参数

字符集转换相关参数:

character_set_client 服务器会认为客户端发送的请求为这个字符集,会将请求以这个字符集的形式进行解码,获取请求内容

character_set_connection 服务器内部处理请求时使用的字符集,服务器会将客户端的请求以这个字符集的形式进行编码 (如果与处理的数据字符集不同就会再进行一次转换)

character_set_results 服务器会将返回的结果以这个字符集的形式进行编码后返回给客户端

查看命令

MySQL 支持许多字符集,通过以下命令可以查看所有支持的字符集

SHOW CHARACTER SET;
SHOW CHARSET;

其中 Default collation 就是这种字符集的默认比较规则,Maxlen 就是这种字符集表示一个字符最多需要的字节数

查看其他参数

SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'character_set_client';
SHOW VARIABLES LIKE 'character_set_connection';
SHOW VARIABLES LIKE 'character_set_results';

设置命令

设置字符集参数

服务器级别:

SET character_set_server 字符集名;

数据库级别:

CREATE DATABASE 数据库名
CHARACTER SET 字符集名称; ALTER DATABASE 数据库名
CHARACTER SET 字符集名称;

表级别

CREATE TABLE 表名 (列的信息)
CHARACTER SET 字符集名称; ALTER TABLE 表名
CHARACTER SET 字符集名称;

列级别

CREATE TABLE 表名(列名 字符串类型 CHARACTER SET 字符集名称);

ALTER TABLE 表名 MODIFY 列名 字符串类型 CHARACTER SET 字符集名称 ;

设置字符集转换参数

一般为了方便会将三个参数设置为同一字符集

使用以下命令就可以同时设置三个参数

SET NAMES 字符集名;

当然也可以分开设置

SET character_set_client = 字符集名;
SET character_set_connection = 字符集名;
SET character_set_results = 字符集名;

比较规则

比较规则有时也称为排序规则,用于在字符串比较大小时规定其顺序的

同一种字符集可以有多种比较规则

命名规则

每一种字符集都可能对应多种比较规则,这些比较规则命名规律为

  • 比较规则名称以对应的字符集名称开头
  • 中间部分表示主要用于哪种语言
  • 后缀有以下几种:
后缀 全称 含义
`_ai` accent insensitive 不区分重音
`_as` accent sensitive 区分重音
`_ci` case insensitive 不区分大小写
`_cs` case sensitive 区分大小写
`_bin` binary 以二进制方式比较

示例:
`utf8_spanish_ci` 表示以西班牙语比较,且不区分大小写

相关参数

collation_server 服务器级别的比较规则

collation_database 当前数据库的比较规则 (如果没有使用 USE 选择数据库,则查看服务器级别的比较规则) 只读,无法通过修改改变当前数据库参数

查看命令

将比较规则全部列出来比较多,可以根据对应的字符集进行筛选

SHOW COLLATION;
SHOW COLLATION LIKE 'utf8\_%';

其中 Charset 表示对应的字符集,Default 表示是否为默认比较规则

设置命令

设置比较规则参数

服务器级别:

SET collation_server 比较规则名;

数据库级别:

CREATE DATABASE 数据库名
COLLATE 比较规则名称; ALTER DATABASE 数据库名
COLLATE 比较规则名称;

表级别

CREATE TABLE 表名 (列的信息)
COLLATE 比较规则名称; ALTER TABLE 表名
COLLATE 比较规则名称;

列级别

CREATE TABLE 表名(列名 字符串类型 COLLATE 比较规则名称);

ALTER TABLE 表名 MODIFY 列名 字符串类型 COLLATE 比较规则名称 ;

总结

当只修改某个级别的字符集或比较规则时,相同级别对应的比较规则或字符集也会跟着改变为对应的 (默认的)

当创建数据库时如果没有指定字符集和比较规则,则默认使用服务器级别的参数

创建表时没有指定字符集和比较规则,则默认使用表所在数据库的参数

创建列时没有指定字符集和比较规则,则默认使用列所在表的参数

MySQL 字符集与比较规则的更多相关文章

  1. MySQL字符集与排序规则总结

      字符集与排序规则概念 在数据库当中都有字符集和排序规则的概念, 很多开发人员甚至包括有些DBA都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...

  2. MySql字符集与排序规则详解

    前段时间往MySQL中存入emoji表情或生僻字.繁体字时,报错无法添加,研究后发现这是字符集编码的问题,今天就来分析一下各个字符集与排序规则 一.字符集 先说字符,字符是各种文字和符号的总称,包括各 ...

  3. MySQL字符集及校对规则的理解

      阅读目录:MySQL的字符集和校对规则 MySQL的字符集 MySQL与字符集 正确使用字符集 MySQL客户端与字符集 字符集编码转换原理 字符集常见处理操作 字符集的正确实践 MySQL的校对 ...

  4. Mysql字符集与校对规则

    字符集是一套字符和编码的集合,校对规则是用于比较字符集的一套规则. 所以字符集有两部分组成字符集合和对应的编码集合.比如说,现在有这几个字符:A B a b, 假设它们对应的编码分别是00, 01, ...

  5. mysql字符集与比较规则

    MySQL有4个级别的字符集和比较规则,分别是: 服务器级别 数据库级别 表级别 列级别 查看服务器级别命令: mysql> SHOW VARIABLES LIKE 'character_set ...

  6. MySQL 字符集及校验规则

    字符集 Mysql 的字符集有4个级别的默认设置:服务器级,数据库级,表级和字段级,客户端交互时,也可以指定字符集 # 字符集:是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国 ...

  7. Mysql 字符集及排序规则

    一.字符集 字符集:就是用来定义字符在数据库中的编码的集合. 常见的字符集:utf8.Unicode.GBK.GB2312(支持中文).ASCCI(不支持中文)   二.字符集排序规则   作者本人用 ...

  8. mysql字符集问题,及排序规则

    字符集问题: 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(E ...

  9. MySQL 字符集和校验规则工作流程

    MySQL 字符集和校验规则工作原理 字符编码相关参数 数据流中的转码过程 校验规则 Tips:字符集和校验规则总是相伴的 一 从简单的建库语句开始 CREATE DATABASE [IF NOT E ...

随机推荐

  1. day_92_11_14flask的启动和orm,反向生成model

    一.自定义命令. 在flask中也可以将应用改写成可以使用命令的形式,需要用到模块: pip install flask-script 使用关键字manage使得其能使用终端启动: from flas ...

  2. 题解:swj社会摇入魔第五课

    题目链接; solution: 根据画图模拟可以知道除第一次纯下降 其余每次都是一半一半的增加 S=h+h+h/2+h/4+h/8+...; 即S=h+2h=3h #include<bits/s ...

  3. 记MacOs视频mov与mp4格式转换问题解决

    综述 记录了mov转mp4格式的方法 记录了自己是多蠢 问题背景 这学期选修的<工程英语视听说>课,需要提交一段口语考试视频,于是乎: 带着我的大疆Mavic Mini 和iPad Pro ...

  4. 【洛谷5072】[Ynoi2015] 盼君勿忘(莫队)

    点此看题面 大致题意: 一个序列,每次询问一个区间\([l,r]\)并给出一个模数\(p\),求模\(p\)意义下区间\([l,r]\)内所有子序列去重后值的和. 题意转化 原来的题意看起来似乎很棘手 ...

  5. Matplotlib绘图及动画总结

    目录 Matplotlib绘图总结 绘图原理 block模式(python默认) interactive模式(ipython模式默认) 深入子图 子图表示 子图绘图 绘制动画 参考链接 Matplot ...

  6. Windows安装与配置—MongoDB

    1,下载安装 打开下载链接:http://dl.mongodb.org/dl/win32/x86_64,选择后缀是2008plus-ssl-3.6.15.zip的版本,32位和64位通用. 2,安装配 ...

  7. IT兄弟连 Java语法教程 数组 多维数组 二维数组的声明

    Java语言里提供了支持多维数组的语法.但是这里还想说,从数组底层的运行机制上来看是没有多维数组的. Java语言里的数组类型是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存,数组元 ...

  8. Java设计模式:Factory Method(工厂方法)模式

    概念定义 工厂方法(Factory Method)模式,又称多态工厂(Polymorphic Factory)模式或虚拟构造器(Virtual Constructor)模式.工厂方法模式通过定义工厂抽 ...

  9. Kubernetes容器日志收集

    日志采集方式 日志从传统方式演进到容器方式的过程就不详细讲了,可以参考一下这篇文章Docker日志收集最佳实践,由于容器的漂移.自动伸缩等特性,日志收集也就必须使用新的方式来实现,Kubernetes ...

  10. java主函数

    相信很多初次接触java的同学,在遇见主函数的时候,听到最多的就是主函数的格式是固定的,不能进行修改等等.这就让人疑惑了,主函数为啥就那么特殊呢?接下来博主会为大家解释主函数.大家先看看下面这个程序: ...