写点什么

MySQL 字符集、排序规则与查询关系详解

  • 2025-06-27
    福建
  • 本文字数:1643 字

    阅读完需:约 5 分钟

MySQL 查询是否区分大小写及重音敏感,取决于创建时指定的字符集(character set)和排序规则(collation)。

(1)字符集(Character Set):规定可存储的字符,如 utf8、utf8mb4、latin1 等。

(2)排序规则(Collation):确定字符比较与排序规则,如是否区分大小写、重音等。


注意:

(1)每个排序规则必须对应特定的字符集,如 utf8mb4_bin 仅用于 utf8mb4 字符集。

(2)“重音敏感”(Accent Sensitive):指排序规则将带重音符号的字母视为与基本字母相同或不同的特性,如 'cafe' 与 'café'。


在 MySQL 5.7 中,默认字符集和排序规则是 latin1 和 latin1_swedish_ci。实际应用里,建议使用 utf8mb4 字符集以支持完整 Unicode 字符(含 emoji),并采用默认对应的 utf8mb4_general_ci 排序规则,该规则下查询不区分大小写。


一、常见排序规则



表格说明:

(1)可通过排序规则后缀判断其是否支持大小写和重音敏感,ci、cs、ai、as 分别表示不区分大小写、区分大小写、不区分重音和区分重音。

(2)带 bin 后缀的排序规则基于二进制(Binary)比较,严格区分和重音。


二、设置方法


1. 数据库实例级


# my.conf 或 my.ini[mysqld]character-set-server=utf8mb4collation-server=utf8mb4_general_ci
复制代码


2. 数据库级


CREATE DATABASE mydb   CHARACTER SET utf8mb4   COLLATE utf8mb4_general_ci;
复制代码


3. 表级


CREATE TABLE case_sensitive_table (    id INT,    username VARCHAR(50)) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
复制代码


4. 列级


CREATE TABLE case_sensitive_table (    id INT,    username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
复制代码


三、设置建议


1. 注意事项


(1)性能影响:使用区分大小写的比较可能会影响查询性能,混合使用不同字符集也可能影响查询优化

(2)存储空间:不同字符集占用的存储空间不同 (如 utf8mb4 比 latin1 占用更多空间)

(3)索引限制:某些情况下不同字符集的列不能直接比较或连接

(4)转换风险:修改已有数据的字符集前需谨慎,可能导致数据丢失或损坏


2. 最佳实践


(1)尽量保持各表及表内各列字符集和排序规则一致,除非有特殊需求

(2)修改已有数据的字符集前先备份数据

(3)对于需要区分大小写的列 (如用户名、验证码),明确指定使用_bin排序规则

(4)应文档化说明使用不同字符集/排序规则的原因

(5)MySQL 8.0 默认使用 utf8mb4 + utf8mb4_0900_ai_ci,它符合更新的 Unicode 标准且性能更优


四、查看方法


## 查看数据库字符集和排序规则
SHOW VARIABLES LIKE 'character_set_server';SHOW VARIABLES LIKE 'collation_server';
## 查看某表字符集和序规则SHOW CREATE TABLE `table_name`; # CHARSET 后面为字符集SHOW TABLE STATUS LIKE 'table_name'; # Collation 列表示排序规则
复制代码


五、查询时如何强制区分大小写


1. 强制方法


如遇到不支持区分大小写的排序规则,可使用以下方法强制启用:


(1)使用 COLLATE 指定区分大小写的排序规则

SELECT * FROM table_name WHERE column_name COLLATE utf8mb4_bin = 'Value'; -- utf8mb4_bin 需适配字符集
复制代码


(2)使用 BINARY 运算符

SELECT * FROM table_name WHERE BINARY column_name = 'Value';
复制代码


(3)使用 LIKE BINARY 语法

SELECT * FROM table_name WHERE column_name LIKE BINARY 'Value';
复制代码


(4)使用区分大小写的函数

SELECT * FROM table_name WHERE CAST(column_name AS BINARY) = CAST('Value' AS BINARY);
复制代码


(5)修改列或表的字符集排序规则

-- 修改列的排序规则ALTER TABLE table_name MODIFY column_name VARCHAR(255) COLLATE utf8mb4_bin;
-- 修改表的默认排序规则ALTER TABLE table_name COLLATE utf8mb4_bin;
复制代码


2. 各方法对比



3. 使用建议


如仅当前查询需区分大小写,建议使用 COLLATE 指定区分大小写的排序规则;如需永久生效,建议修改列或表的字符集排序规则


文章转载自:曾左 

原文链接:https://www.cnblogs.com/zengzuo613/p/18943037

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2025-04-01 加入

还未添加个人简介

评论

发布
暂无评论
MySQL 字符集、排序规则与查询关系详解_MySQL_电子尖叫食人鱼_InfoQ写作社区