先说一下推荐设置
字符集和编码格式推荐配置
- 统一使用
utf8mb4
: 推荐使用utf8mb4
字符集,因为它支持更广泛的字符集,包括 emoji。- 选择合适的排序规则:
utf8mb4_unicode_ci
适合大多数情况,utf8mb4_general_ci
在某些情况下可能更快,但 Unicode 标准的支持不如utf8mb4_unicode_ci
。- 服务器、数据库、表、列级别统一设置: 尽量保持字符集和排序规则在各个级别的一致性,避免出现不必要的转换问题。
- 在项目开始前就设置: 在项目开始前就正确设置字符集和排序规则,可以避免后续因为数据编码不一致导致的问题。
存储引擎推荐配置
- 推荐使用 InnoDB: 在大多数情况下,InnoDB 引擎是最佳选择,因为它支持事务、行级锁定,适合高并发和需要数据一致性的应用。
- 特殊需求时选择其他引擎: 只有在有特殊需求时,比如只需要读取数据,对并发写入要求不高,可以考虑使用 MyISAM 等其他引擎。
字符集和编码格式
查看当前会话的字符集
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%';
输出
client:客户端将SQL发送给MySQL服务器所用的字符集,例如Navicat写的SQL运行
connection:服务器解析处理从客户端接收的SQL所用的字符集
database:当前库的默认字符集,例如创建表列,如果没有指定则默认
filesystem:服务器与文件系统进行交互所用的字符集,例如读写文件时
- results:服务器向客户端返回查询结果所用的字符集,要与client一致
- server:服务器的内部默认字符集
- system:服务器存储系统表使用的字符集,例如:information_schema中的表
查看当前会话的编码格式
SHOW VARIABLES WHERE Variable_name LIKE 'collation\_%';
查看数据库的字符集和编码格式
SELECT DATABASE(), DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = DATABASE();
查看表的字符集和编码格式
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name';
查看字段的字符集和编码格式
SELECT COLUMN_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name';
服务器级别设置
配置文件,my.cnf或my.ini
```ini[mysqld]character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci```* **`character-set-server = utf8mb4`**: 设置服务器默认字符集为 utf8mb4。* **`collation-server = utf8mb4_unicode_ci`**: 设置服务器默认排序规则为 utf8mb4_unicode_ci, 大小写不敏感。* **重启 MySQL 服务** 以使更改生效。* **验证服务器级别设置:**```sqlSHOW VARIABLES LIKE 'character_set_server';SHOW VARIABLES LIKE 'collation_server';```
库级别设置
创建库时或之后
* **创建数据库时:**```sqlCREATE DATABASE your_database_nameCHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci;```* **修改现有数据库:**```sqlALTER DATABASE your_database_nameCHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci;```* **验证数据库级别设置:**```sqlSHOW CREATE DATABASE your_database_name;```
表级别设置
创建表时或之后
* **创建表时:**```sqlCREATE TABLE your_table_name (...)CHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci;```* **修改现有表:**```sqlALTER TABLE your_table_nameCHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci;```* **验证表级别设置:**```sqlSHOW CREATE TABLE your_table_name;```
列级别设置
创建表时或之后
* **创建表时:**```sqlCREATE TABLE your_table_name (column1 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,column2 TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,...);```* **修改现有表:**```sqlALTER TABLE your_table_nameMODIFY COLUMN column1 VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;```* **验证列级别设置 (可以使用 `SHOW CREATE TABLE` 命令查看表定义):**
存储引擎
MySQL 支持多种存储引擎,每种引擎都有其特定的用途和特性,最常用的有:
- InnoDB: MySQL 8 的默认存储引擎,支持事务、行级锁定、崩溃恢复等特性,适合需要 ACID 事务的场景。
- MyISAM: 不支持事务,表级锁定,适合读取频繁的应用,但对并发写入性能较差。
查看所有存储引擎
SHOW ENGINES;
查看表的存储引擎
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'your_database_name';
查看库的默认存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';
服务器级别设置
ini [mysqld] default-storage-engine = InnoDB
* `default-storage-engine = InnoDB`:设置默认存储引擎为 InnoDB。* **重启 MySQL 服务** 以使更改生效。
表级别设置
```sql
CREATE TABLE your_table_name (
...
) ENGINE = InnoDB; -- 或者CREATE TABLE your_table_name (...) ENGINE = MyISAM;```* **注意:** 可以在每个表的定义中指定使用的存储引擎。
```sqlALTER TABLE your_table_name ENGINE=InnoDB;```
总结:
- 字符集:
utf8mb4
是推荐的,可以存储各种字符。选择合适的排序规则(utf8mb4_unicode_ci
或utf8mb4_general_ci
) - 存储引擎:
InnoDB
是默认且常用的,适合大多数应用。