- MySQL 基础
- MySQL - 首页
- MySQL - 简介
- MySQL - 特性
- MySQL - 版本
- MySQL - 变量
- MySQL - 安装
- MySQL - 管理
- MySQL - PHP 语法
- MySQL - Node.js 语法
- MySQL - Java 语法
- MySQL - Python 语法
- MySQL - 连接
- MySQL - Workbench
- MySQL 数据库
- MySQL - 创建数据库
- MySQL - 删除数据库
- MySQL - 选择数据库
- MySQL - 显示数据库
- MySQL - 复制数据库
- MySQL - 数据库导出
- MySQL - 数据库导入
- MySQL - 数据库信息
- MySQL 用户
- MySQL - 创建用户
- MySQL - 删除用户
- MySQL - 显示用户
- MySQL - 修改密码
- MySQL - 授予权限
- MySQL - 显示权限
- MySQL - 收回权限
- MySQL - 锁定用户账户
- MySQL - 解锁用户账户
- MySQL 表
- MySQL - 创建表
- MySQL - 显示表
- MySQL - 修改表
- MySQL - 重命名表
- MySQL - 克隆表
- MySQL - 截断表
- MySQL - 临时表
- MySQL - 修复表
- MySQL - 描述表
- MySQL - 添加/删除列
- MySQL - 显示列
- MySQL - 重命名列
- MySQL - 表锁定
- MySQL - 删除表
- MySQL - 派生表
- MySQL 查询
- MySQL - 查询
- MySQL - 约束
- MySQL - 插入查询
- MySQL - 选择查询
- MySQL - 更新查询
- MySQL - 删除查询
- MySQL - 替换查询
- MySQL - 插入忽略
- MySQL - 插入重复键更新
- MySQL - 插入选择
- MySQL 运算符和子句
- MySQL - Where 子句
- MySQL - Limit 子句
- MySQL - Distinct 子句
- MySQL - Order By 子句
- MySQL - Group By 子句
- MySQL - Having 子句
- MySQL - AND 运算符
- MySQL - OR 运算符
- MySQL - Like 运算符
- MySQL - IN 运算符
- MySQL - ANY 运算符
- MySQL - EXISTS 运算符
- MySQL - NOT 运算符
- MySQL - 不等于运算符
- MySQL - IS NULL 运算符
- MySQL - IS NOT NULL 运算符
- MySQL - Between 运算符
- MySQL - UNION 运算符
- MySQL - UNION 与 UNION ALL
- MySQL - MINUS 运算符
- MySQL - INTERSECT 运算符
- MySQL - INTERVAL 运算符
- MySQL 连接
- MySQL - 使用连接
- MySQL - 内连接
- MySQL - 左连接
- MySQL - 右连接
- MySQL - 交叉连接
- MySQL - 全连接
- MySQL - 自连接
- MySQL - 删除连接
- MySQL - 更新连接
- MySQL - Union 与 Join
- MySQL 触发器
- MySQL - 触发器
- MySQL - 创建触发器
- MySQL - 显示触发器
- MySQL - 删除触发器
- MySQL - 插入前触发器
- MySQL - 插入后触发器
- MySQL - 更新前触发器
- MySQL - 更新后触发器
- MySQL - 删除前触发器
- MySQL - 删除后触发器
- MySQL 数据类型
- MySQL - 数据类型
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正则表达式
- MySQL - 正则表达式
- MySQL - RLIKE 运算符
- MySQL - NOT LIKE 运算符
- MySQL - NOT REGEXP 运算符
- MySQL - regexp_instr() 函数
- MySQL - regexp_like() 函数
- MySQL - regexp_replace() 函数
- MySQL - regexp_substr() 函数
- MySQL 函数 & 运算符
- MySQL - 日期和时间函数
- MySQL - 算术运算符
- MySQL - 数值函数
- MySQL - 字符串函数
- MySQL - 聚合函数
- MySQL 杂项概念
- MySQL - NULL 值
- MySQL - 事务
- MySQL - 使用序列
- MySQL - 处理重复项
- MySQL - SQL 注入
- MySQL - 子查询
- MySQL - 注释
- MySQL - 检查约束
- MySQL - 存储引擎
- MySQL - 将表导出到 CSV 文件
- MySQL - 将 CSV 文件导入数据库
- MySQL - UUID
- MySQL - 公共表表达式
- MySQL - On Delete Cascade
- MySQL - Upsert
- MySQL - 水平分区
- MySQL - 垂直分区
- MySQL - 游标
- MySQL - 存储函数
- MySQL - 信号
- MySQL - 重新发送信号
- MySQL - 字符集
- MySQL - 校对规则
- MySQL - 通配符
- MySQL - 别名
- MySQL - ROLLUP
- MySQL - 当天日期
- MySQL - 字面量
- MySQL - 存储过程
- MySQL - Explain
- MySQL - JSON
- MySQL - 标准差
- MySQL - 查找重复记录
- MySQL - 删除重复记录
- MySQL - 选择随机记录
- MySQL - 显示 Processlist
- MySQL - 更改列类型
- MySQL - 重置自动递增
- MySQL - Coalesce() 函数
- MySQL 有用资源
- MySQL - 有用函数
- MySQL - 语句参考
- MySQL - 快速指南
- MySQL - 有用资源
- MySQL - 讨论
MySQL - 校对规则
MySQL 校对规则是一组用于决定如何比较和排序字符集的各种字符的规则。MySQL 支持多种字符集,包括 ASCII、Unicode 系统、二进制等。
这些字符集的每个字符都受制于一个权重。MySQL 校对规则根据其各自的权重对字符进行排序。例如,当在一个字符集中比较两个字符时,如果一个字符的权重比另一个字符重,则它更大;反之亦然。如果两个字符的权重相等,则它们相等。
每个字符集必须至少有一个(或多个)校对规则,并且不能有两个字符集具有相同的校对规则。
实现 MySQL 校对规则
MySQL 实现各种类型的校对规则以比较字符字符串 -
8 位字符集的简单校对规则
8 位字符集的复杂校对规则
非 Unicode 多字节字符集的校对规则
Unicode 多字节字符集的校对规则
杂项校对规则
每个字符集都有一个内置的二进制校对规则,因此不需要重新定义它们。像这样的内置校对规则在任何情况下都不得修改,以避免服务器出现意外行为。
8 位字符集的简单校对规则
- 由于 8 位字符集只能容纳最多 256 个字符,因此此类型的校对规则是通过使用长度为 256 的权重数组来实现的。
- 字符集中的每个字符都与权重一一映射。
- 它是不区分大小写的校对规则,因此相同字符的大写和小写具有相同的权重。
8 位字符集的复杂校对规则
- 对于复杂的 8 位字符集,校对规则是通过使用函数定义字符的顺序来实现的。
- 在这里,我们创建一个 C 源文件,该文件指定字符集属性并定义必要的支持例程以正确地对该字符集执行操作。
非 Unicode 多字节字符集的校对规则
- 与单字节(8 位)字符不同,多字节字符的代码和权重之间存在两种类型的关系。
- 字符的权重等于其代码。
- 字符代码与权重一一映射,其中权重不一定等于代码。
Unicode 多字节字符集的校对规则
一些校对规则基于 Unicode 校对算法 (UCA)。它们具有以下属性 -
- 如果一个字符有权重,则每个权重使用 2 个字节。
- 如果一个字符没有权重,则该字符可忽略。
- 单个字符可以有多个权重。这称为扩展。例如,德文字母(SHARP S)的权重为 0x0FEA0FEA。
- 多个字符在一起只能有一个权重。这称为收缩。例如,“ch”在捷克语中是一个字母,其权重为 0x0EE2。
杂项校对规则
- 不属于任何先前类别的校对规则称为杂项校对规则。
设置字符集和校对规则
MySQL 允许我们在三个不同的级别设置字符集和校对规则。下面描述了相同的内容
在服务器级别
在数据库级别
在表级别
在服务器级别
在 MySQL 中,字符集latin1将用作默认字符集。因此,默认校对规则将为latin1_swedish_ci。MySQL 允许我们在服务器启动级别更改这些默认设置。
在启动 MySQL 服务器时,如果我们指定一个字符集,它将使用该字符集的默认校对规则。但是,如果我们显式地同时指定字符集和校对规则,则 MySQL 将对进一步创建的所有数据库使用该组合。
示例
在以下查询中,我们将字符集设置为 utf8,并将校对规则设置为 utf8_unicode_cs 用于服务器。
mysqld --character-set-server=utf8 --collation-server=utf8_unicode_cs
如果--collation-server设置为用户定义的校对规则名称,则会发出警告。
在数据库级别
当我们创建一个数据库并且如果我们没有提供任何字符集和校对规则时,数据库将使用服务器的默认字符集和校对规则。
我们可以使用 CREATE DATABASE 语句在数据库级别覆盖默认字符集和校对规则。
如果我们想覆盖现有数据库的默认设置,可以使用 ALTER DATABASE 语句。
语法
以下是覆盖数据库级别默认设置的基本语法 -
[CREATE | ALTER] DATABASE database_name CHARACTER SET character_set_name COLLATE collation_name;
示例
这里,我们正在创建一个数据库,并使用以下查询将字符集指定为 utf8,并将排序规则指定为 utf8_unicode_ci。
CREATE DATABASE testdb CHARACTER SET utf8 COLLATE utf8_unicode_ci;
在表级别
在 MySQL 中,数据库可以包含与数据库字符集和排序规则不同的字符集和排序规则的表。
我们可以在使用 CREATE TABLE 语句创建表时指定默认的字符集和排序规则。
如果我们想覆盖现有表的默认设置,可以使用 ALTER TABLE 语句。
语法
以下是使用 CREATE TABLE 语句为表指定默认字符集和排序规则的语法:
[CREATE | ALTER] TABLE table_name column_name datatype (length) CHARACTER SET character_set_name COLLATE collation_name
示例
在以下查询中,我们正在创建一个没有任何字符集和排序规则的表。因此,它使用数据库的字符集和排序规则。
CREATE TABLE CUSTOMERS( ID VARCHAR(45), NAME VARCHAR(45), AGE INT );
现在,我们使用 ALTER TABLE 语句将字符集修改为“latin1”,并将排序规则修改为“latin_german_ci”。
ALTER TABLE CUSTOMERS CHARACTER SET latin1 COLLATE latin1_german1_ci;
显示默认校对规则
我们可以使用 SHOW CHARACTER SET 查询显示 MySQL 数据库服务器中所有字符集的默认排序规则。
SHOW CHARACTER SET;
用户定义的排序规则在最新版本的 MySQL 中已弃用。因此,如果在任何 SQL 语句中使用它们,服务器会发出警告。
每个字符集的排序规则字符串以字符集名称开头,以 _ci(不区分大小写)、_cs(区分大小写)或 _bin(二进制)结尾。
MySQL LIKE 子句
在 MySQL 中,使用 SHOW COLLATION 语句结合 LIKE 子句,我们可以指定一个模式来获取与给定模式匹配的排序规则的名称和其他信息。
SHOW COLLATION LIKE 'greek%';
输出
以上查询返回所有名称中包含greek的排序规则。
排序规则 | 字符集 | ID | 默认 | 已编译 | 排序长度 |
---|---|---|---|---|---|
greek_bin | greek | 70 | 是 | 1 | |
greek_general_ci | greek | 25 | 是 | 是 | 1 |
MySQL WHERE 子句
我们可以使用 SHOW COLLATION 语句结合 WHERE 子句来检索与指定条件匹配的排序规则名称。
SHOW COLLATION WHERE Charset = 'cp1251';
输出
以上查询返回字符集 ID 等于“cp1251”的所有排序规则。
排序规则 | 字符集 | ID | 默认 | 已编译 | 排序长度 |
---|---|---|---|---|---|
cp1251_bin | cp1251 | 50 | 是 | 1 | |
cp1251_bulgarian_ci | cp1251 | 14 | 是 | 1 | |
cp1251_general_ci | cp1251 | 51 | 是 | 是 | 1 |
cp1251_general_cs | cp1251 | 52 | 是 | 1 | |
cp1251_ukrainian_ci | cp1251 | 23 | 是 | 1 |