您好,登录后才能下订单哦!
# MySQL字符集和比较规则
## 一、字符集基础概念
### 1.1 什么是字符集
字符集(Character Set)是数据库中用于定义字符编码方式的规则集合。它决定了:
- 如何将字符转换为二进制数据存储
- 如何将存储的二进制数据解析为字符
MySQL支持的常见字符集包括:
- `latin1`:西欧字符集
- `utf8`:UTF-8编码(MySQL中的"utf8"是阉割版)
- `utf8mb4`:完整的UTF-8编码(推荐使用)
- `gbk`:简体中文
- `big5`:繁体中文
### 1.2 为什么需要字符集
1. **存储多语言数据**:不同语言需要不同的编码方式
2. **避免乱码问题**:确保数据的正确存储和显示
3. **排序和比较需求**:不同语言有不同的排序规则
## 二、MySQL字符集详解
### 2.1 字符集层级结构
MySQL的字符集设置分为四个层级:
| 层级 | 设置方法 | 优先级 |
|------|----------|--------|
| 服务器级 | `my.cnf`配置或启动参数 | 最低 |
| 数据库级 | `CREATE DATABASE`时指定 | 中 |
| 表级 | `CREATE TABLE`时指定 | 高 |
| 列级 | 列定义时指定 | 最高 |
```sql
-- 创建数据库时指定字符集
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建表时指定字符集
CREATE TABLE mytable (
id INT,
name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 查看所有可用字符集
SHOW CHARACTER SET;
-- 查看当前数据库字符集
SHOW VARIABLES LIKE 'character_set_database';
-- 查看表的字符集
SHOW CREATE TABLE table_name;
-- 查看列的字符集
SHOW FULL COLUMNS FROM table_name;
比较规则(Collation)定义了字符集中字符的排序和比较方式。每个字符集都有对应的比较规则,例如:
- utf8mb4_general_ci
:不区分大小写的通用排序
- utf8mb4_unicode_ci
:基于Unicode标准的排序
- utf8mb4_bin
:二进制比较
比较规则名称通常遵循以下格式:
字符集名称_语言_后缀
常见后缀:
- ci
:Case Insensitive(不区分大小写)
- cs
:Case Sensitive(区分大小写)
- bin
:Binary(二进制比较)
ORDER BY
的结果WHERE
条件中的比较-- 使用不同的比较规则进行排序
SELECT * FROM users ORDER BY username COLLATE utf8mb4_bin;
特性 | utf8 | utf8mb4 |
---|---|---|
最大字符长度 | 3字节 | 4字节 |
支持emoji | 否 | 是 |
完整Unicode支持 | 否 | 是 |
建议:新项目应直接使用utf8mb4
在my.cnf
中配置:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
-- 修改数据库字符集
ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 修改表字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 只修改表的默认字符集(不转换已有数据)
ALTER TABLE table_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW VARIABLES LIKE 'character_set%';
确保连接使用正确的字符集:
-- 建立连接后立即设置
SET NAMES 'utf8mb4';
或在JDBC连接字符串中指定:
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8
当需要区分大小写时:
-- 使用区分大小写的比较规则
SELECT * FROM users WHERE username COLLATE utf8mb4_bin = 'Admin';
utf8mb4
比latin1
占用更多存储空间unicode_ci
)比简单的规则(如general_ci
)消耗更多CPU资源utf8mb4_unicode_ci
COLLATE utf8mb4_bin
CHAR
类型存储固定长度的字符串现象:无法存储emoji表情
解决方案:
1. 将字符集改为utf8mb4
2. 修改连接字符集为utf8mb4
3. 确保列定义使用utf8mb4
现象:不同服务器上ORDER BY
结果不同
原因:服务器使用了不同的比较规则
解决方案:统一所有环境的collation_server
设置
utf8mb4
字符集和utf8mb4_unicode_ci
比较规则命令 | 说明 |
---|---|
SHOW CHARACTER SET; |
查看可用字符集 |
SHOW COLLATION LIKE 'utf8mb4%'; |
查看特定字符集的比较规则 |
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4; |
转换表字符集 |
SET NAMES 'utf8mb4'; |
设置连接字符集 |
SELECT CHARSET(col), COLLATION(col) FROM t; |
查看列字符集信息 |
”`
这篇文章共计约2600字,全面介绍了MySQL字符集和比较规则的概念、配置方法、常见问题及解决方案。采用Markdown格式,包含代码块、表格等元素,便于阅读和理解。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。