Skip to content

第4章:数据库操作 ​

本章目标 ​

学完本章后,你将能够:

  1. 使用 CREATE DATABASE 创建数据库并指定字符集和排序规则
  2. 深刻理解字符集(charset)和排序规则(collation)的概念,尤其是 utf8 与 utf8mb4 的著名陷阱
  3. 使用 ALTER DATABASE 修改数据库属性,使用 DROP DATABASE 删除数据库
  4. 通过 SHOW 命令查看数据库的定义、字符集、排序规则等元信息
  5. 遵循数据库命名规范,避免常见的坑

前置知识 ​

  • 第1章:理解数据库、DBMS 等基本概念
  • 第3章:能使用 mysql 客户端连接 MySQL,会用 SHOW、USE 等命令

4.1 CREATE DATABASE 创建数据库 ​

完整语法 ​

sql
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] 数据库名
    [DEFAULT] CHARACTER SET [=] 字符集名
    [DEFAULT] COLLATE [=] 排序规则名;
  • DATABASE 和 SCHEMA 在 MySQL 中是同义词,用哪个都可以
  • [方括号] 中的内容是可选的
  • DEFAULT 关键字在 MySQL 中可以省略

最简单的创建 ​

sql
-- 创建一个名为 school 的数据库(使用服务器的默认字符集和排序规则)
CREATE DATABASE school;
-- Query OK, 1 row affected (0.01 sec)

但这创建出来的数据库使用的是什么字符集呢?

sql
-- 查看服务器默认字符集
SHOW VARIABLES LIKE 'character_set_server';

-- 查看新建数据库的完整定义
SHOW CREATE DATABASE school\G
-- *************************** 1. row ***************************
--        Database: school
-- Create Database: CREATE DATABASE `school` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */

反引号 `` 的作用:MySQL 使用反引号(backtick,键盘上 Tab 键上面的键)来引用数据库名、表名、列名。如果你的名字包含特殊字符、空格,或是 MySQL 保留字,必须用反引号括起来。例如:CREATE DATABASE \my database`;`(强烈不建议用特殊字符命名!)

使用 IF NOT EXISTS 避免错误 ​

sql
-- 没有 IF NOT EXISTS,重复创建会报错
CREATE DATABASE school;
-- ERROR 1007 (HY000): Can't create database 'school'; database exists

-- 加了 IF NOT EXISTS,存在则静默跳过(加上一个 warning)
CREATE DATABASE IF NOT EXISTS school;
-- Query OK, 1 row affected, 1 warning (0.00 sec)

-- 查看 warning
SHOW WARNINGS;
-- +-------+------+----------------------------------------------+
-- | Level | Code | Message                                      |
-- +-------+------+----------------------------------------------+
-- | Note  | 1007 | Can't create database 'school'; database exists |
-- +-------+------+----------------------------------------------+

最佳实践:在脚本中创建数据库时,始终加上 IF NOT EXISTS,这样脚本可以安全地重复执行而不会因"数据库已存在"而中断。

指定字符集和排序规则 ​

sql
-- 创建数据库并明确指定字符集为 utf8mb4
CREATE DATABASE blog
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

-- 查看创建语句确认
SHOW CREATE DATABASE blog\G
-- CREATE DATABASE `blog` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */

4.2 字符集(Character Set)详解 ​

什么是字符集 ​

字符集是字符到数字的映射表。当计算机存储字符时,实际存储的是该字符在字符集中对应的数字(即"编码")。

例如在 ASCII 字符集中:

  • A → 65(十六进制 0x41)
  • a → 97(十六进制 0x61)
  • 中文字符在 ASCII 中根本不存在——ASCII 只有 128 个字符,只覆盖了英文字母、数字、标点符号

MySQL 支持的字符集 ​

sql
-- 查看 MySQL 支持的所有字符集
SHOW CHARACTER SET;
-- +----------+---------------------------------+---------------------+--------+
-- | Charset  | Description                     | Default collation   | Maxlen |
-- +----------+---------------------------------+---------------------+--------+
-- | armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
-- | ascii    | US ASCII                        | ascii_general_ci    |      1 |
-- | gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
-- | gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
-- | latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
-- | utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |   ← 注意!
-- | utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |   ← 正确的选择
-- +----------+---------------------------------+---------------------+--------+

utf8 vs utf8mb4 —— 一个著名的 MySQL 陷阱 ​

这是 MySQL 历史上最大的"坑"之一。

MySQL 的 utf8 不是真正的 UTF-8!

  • 标准 UTF-8:最多支持 4 字节编码,能够表示所有 Unicode 字符(包括 emoji 和部分古文字/罕见汉字)
  • MySQL 的 utf8:Maxlen = 3,只支持最多 3 个字节的字符。这意味着它只能表示"基本多文种平面(BMP, Basic Multilingual Plane)"中的字符
  • MySQL 的 utf8mb4:Maxlen = 4,这才是真正的、完整的 UTF-8!

哪些字符需要 4 字节?

  • 😀😃😂🤣😊😍🤔🙄😭 等 emoji 表情
  • 𠮷(日本汉字,一部分不在 BMP 内的罕见汉字)
  • 一些历史文字、音乐符号等
sql
-- 验证 utf8 的局限
CREATE DATABASE test_utf8 CHARACTER SET utf8;
USE test_utf8;

CREATE TABLE test (content VARCHAR(100));
INSERT INTO test VALUES ('Hello');         -- ✅ 正常
INSERT INTO test VALUES ('你好');           -- ✅ 正常(3字节的中文字)
INSERT INTO test VALUES ('😀');             -- ❌ 报错!Incorrect string value: '\xF0\x9F\x98\x80'

-- 换用 utf8mb4
DROP DATABASE test_utf8;
CREATE DATABASE test_utf8mb4 CHARACTER SET utf8mb4;
USE test_utf8mb4;

CREATE TABLE test (content VARCHAR(100));
INSERT INTO test VALUES ('😀');             -- ✅ 正常!
bash
# 用 xxd 或 hexdump 可以看到 emoji 确实占 4 个字节
echo -n '😀' | xxd
# 输出: f0 9f 98 80  ← 4个字节!
# 而 MySQL 的 utf8 只接受 3 字节(\xE0-\xEF 开头),4 字节(\xF0 开头)就被拒绝了

结论:永远使用 utf8mb4,不要使用 utf8! 这个教训已经让无数开发者踩坑。WordPress 直到发布 10 年后才开始默认使用 utf8mb4,之前用户插入 emoji 到文章内容都会出错。


4.3 排序规则(Collation)详解 ​

什么是排序规则 ​

排序规则(Collation) 决定了两件事:

  1. 字符串如何比较(WHERE 条件中的 =、>、<)
  2. 字符串如何排序(ORDER BY)

一个字符集可以有多个排序规则。排序规则的命名通常遵循:字符集名_语言_比较类型。

常见的排序规则后缀 ​

后缀含义示例
_ciCase Insensitive(大小写不敏感)utf8mb4_general_ci
_csCase Sensitive(大小写敏感)utf8mb4_0900_as_cs
_binBinary(按二进制字节值比较,大小写敏感)utf8mb4_bin
_aiAccent Insensitive(重音不敏感)utf8mb4_0900_ai_ci
_asAccent Sensitive(重音敏感)utf8mb4_0900_as_cs
_general通用(比较速度快,但准确性较低)utf8_general_ci
_unicode基于 Unicode 标准(准确性高,速度稍慢)utf8mb4_unicode_ci
_0900基于 Unicode 9.0 标准(MySQL 8.0 新的默认)utf8mb4_0900_ai_ci

大小写敏感性演示 ​

sql
CREATE DATABASE collation_test
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_general_ci;   -- _ci = 大小写不敏感

USE collation_test;

CREATE TABLE demo (name VARCHAR(20));

INSERT INTO demo VALUES ('Alice'), ('alice'), ('ALICE'), ('Bob');

-- _ci 排序规则下,大小写不敏感——'Alice' = 'alice'
SELECT * FROM demo WHERE name = 'Alice';
-- +-------+
-- | name  |
-- +-------+
-- | Alice |
-- | alice |
-- | ALICE |
-- +-------+
-- 三行都返回!因为大小写不敏感

-- ORDER BY 排序(_ci 下,大小写不分先后)
SELECT * FROM demo ORDER BY name;
-- +-------+
-- | name  |
-- +-------+
-- | Alice |
-- | alice |
-- | ALICE |
-- | Bob   |
-- +-------+
sql
-- 对比 _bin(二进制排序)
CREATE TABLE demo_bin (name VARCHAR(20))
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

INSERT INTO demo_bin VALUES ('Alice'), ('alice'), ('ALICE'), ('Bob');

SELECT * FROM demo_bin WHERE name = 'Alice';
-- +-------+
-- | name  |
-- +-------+
-- | Alice |
-- +-------+
-- 只返回精确匹配的一行!

SELECT * FROM demo_bin ORDER BY name;
-- +-------+
-- | name  |
-- +-------+
-- | ALICE |
-- | Alice |
-- | Bob   |
-- | alice |
-- +-------+
-- 按二进制排序:大写字母的 ASCII 码 < 小写字母的 ASCII 码

_bin 并不是"大小写敏感版的 _ci":_bin 按二进制字节比较,所有字符都按字节值排序,包括特殊字符、标点符号等。而 _ci 和 _cs 会遵循 Unicode 排序规则(比如在德语中 ß 应该排在 s 附近等)。

查看可用的排序规则 ​

sql
-- 查看所有排序规则
SHOW COLLATION;

-- 只查看 utf8mb4 相关的排序规则
SHOW COLLATION WHERE CHARSET = 'utf8mb4';
-- +----------------------------+---------+-----+---------+----------+---------+---------------+
-- | Collation                  | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |
-- +----------------------------+---------+-----+---------+----------+---------+---------------+
-- | utf8mb4_general_ci         | utf8mb4 |  45 |         | Yes      |       1 | PAD SPACE     |
-- | utf8mb4_bin                | utf8mb4 |  46 |         | Yes      |       1 | PAD SPACE     |
-- | utf8mb4_unicode_ci         | utf8mb4 | 224 |         | Yes      |       8 | PAD SPACE     |
-- | utf8mb4_0900_ai_ci         | utf8mb4 | 255 | Yes     | Yes      |       0 | NO PAD        |
-- | utf8mb4_0900_as_ci         | utf8mb4 | 305 |         | Yes      |       0 | NO PAD        |
-- | utf8mb4_0900_as_cs         | utf8mb4 | 278 |         | Yes      |       0 | NO PAD        |
-- | utf8mb4_0900_bin           | utf8mb4 | 309 |         | Yes      |       1 | NO PAD        |
-- +----------------------------+---------+-----+---------+----------+---------+---------------+

默认排序规则变化:MySQL 5.7 和之前版本的默认 utf8mb4 排序规则是 utf8mb4_general_ci。MySQL 8.0 改成了 utf8mb4_0900_ai_ci(基于 Unicode 9.0 标准,重音不敏感,大小写不敏感)。如果你从旧版迁移,排序规则可能不一致,需要注意。

实际选择建议 ​

场景推荐排序规则原因
一般应用(用户名、文章标题)utf8mb4_unicode_ci 或 utf8mb4_0900_ai_ci大小写不敏感,符合大多数用户预期
需要区分大小写(密码、令牌)utf8mb4_bin精确匹配二进制值
收件地址、精确文本utf8mb4_0900_as_cs大小写和重音都敏感
与老系统兼容utf8mb4_general_ci与 MySQL 5.x 默认一致

4.4 数据库操作示例集 ​

创建不同字符集和排序规则的数据库 ​

sql
-- 1. 面向国际化的博客系统(推荐配置)
CREATE DATABASE IF NOT EXISTS blog
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_0900_ai_ci;

-- 2. 中国本地应用(GBK 中文专用,但不推荐新项目使用)
CREATE DATABASE IF NOT EXISTS legacy_app
    CHARACTER SET gbk
    COLLATE gbk_chinese_ci;

-- 3. 西欧语言应用
CREATE DATABASE IF NOT EXISTS europe_app
    CHARACTER SET latin1
    COLLATE latin1_general_ci;

-- 4. 需要大小写敏感的系统
CREATE DATABASE IF NOT EXISTS case_sensitive_app
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_bin;

-- 5. 二进制日志存储(不需要字符集语义)
CREATE DATABASE IF NOT EXISTS binary_logs
    CHARACTER SET binary;

-- 确认所有创建的数据库
SHOW DATABASES;

4.5 查看数据库信息 ​

SHOW CREATE DATABASE ​

sql
-- 查看某个数据库的创建语句(最完整的信息)
SHOW CREATE DATABASE blog\G
-- *************************** 1. row ***************************
--        Database: blog
-- Create Database: CREATE DATABASE `blog`
--                  /*!40100 DEFAULT CHARACTER SET utf8mb4
--                  COLLATE utf8mb4_0900_ai_ci */
--                  /*!80016 DEFAULT ENCRYPTION='N' */

/*!40100 ... */ 是什么?这是 MySQL 的"条件注释",40100 表示 MySQL 4.01.00 及以上版本会解析注释里的内容。也就是说:低版本 MySQL 看到的是注释,高版本会执行里面的 SQL。这是一种跨版本兼容的技巧。

查看所有数据库及其字符集 ​

sql
-- 方式一:通过 information_schema 查询
SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA;
-- +--------------------+----------------------------+------------------------+
-- | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
-- +--------------------+----------------------------+------------------------+
-- | blog               | utf8mb4                    | utf8mb4_0900_ai_ci     |
-- | school             | utf8mb4                    | utf8mb4_0900_ai_ci     |
-- | information_schema | utf8                       | utf8_general_ci        |
-- | mysql              | utf8mb4                    | utf8mb4_0900_ai_ci     |
-- | performance_schema | utf8mb4                    | utf8mb4_0900_ai_ci     |
-- | sys                | utf8mb4                    | utf8mb4_0900_ai_ci     |
-- +--------------------+----------------------------+------------------------+

SHOW DATABASES LIKE 过滤 ​

sql
-- 查看所有以 test 开头的数据库
SHOW DATABASES LIKE 'test%';
-- +------------------+
-- | Database (test%) |
-- +------------------+
-- | test_utf8        |
-- | test_utf8mb4     |
-- +------------------+

-- 查看名字长度为 5 个字符的数据库(_ 匹配单个字符)
SHOW DATABASES LIKE '_____';
-- 五个下划线表示 5 个任意字符

-- 你也可以用 information_schema 做更灵活的查询
SELECT SCHEMA_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME LIKE 't%';

4.6 ALTER DATABASE 修改数据库 ​

ALTER DATABASE 主要用于修改数据库的字符集和排序规则。

sql
ALTER DATABASE 数据库名
    [DEFAULT] CHARACTER SET [=] 字符集名
    [DEFAULT] COLLATE [=] 排序规则名;

修改示例 ​

sql
-- 查看当前字符集
SHOW CREATE DATABASE blog\G
-- DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci

-- 修改为不同的排序规则
ALTER DATABASE blog
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_bin;

-- 再次确认
SHOW CREATE DATABASE blog\G
-- DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

重要警告:ALTER DATABASE 不会转换已有数据 ​

sql
-- 场景:原来用 utf8 建的库,想升级到 utf8mb4
ALTER DATABASE old_db
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

这只改变了数据库的默认字符集! 之前创建的表、表中的列,它们仍然是 utf8!插入 emoji 仍然会报错!

要彻底转换已有表,需要逐表操作:

sql
-- 方法一:逐表修改
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 方法二:生成批量转换的所有表的 SQL
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'old_db';

-- 方法三:对整个库所有表转换(慎用!大表会很慢且锁表)
-- 导出 → 修改建库语句 → 重新导入

4.7 DROP DATABASE 删除数据库 ​

sql
DROP {DATABASE | SCHEMA} [IF EXISTS] 数据库名;
sql
-- 删除数据库
DROP DATABASE test_utf8;
-- Query OK, 1 row affected (0.02 sec)

-- 加 IF EXISTS 防止数据库不存在时报错
DROP DATABASE IF EXISTS test_utf8;
-- Query OK, 0 rows affected, 1 warning (0.00 sec)

-- 数据库不存在时,不加 IF EXISTS 会报错
DROP DATABASE not_exist_db;
-- ERROR 1008 (HY000): Can't drop database 'not_exist_db'; database doesn't exist

删除数据库的严重警告 ​

⚠️  DROP DATABASE 是不可逆的!
    MySQL 没有"回收站"或"垃圾桶"功能!
    删除后数据无法恢复(除非有备份)!

在公司环境中,删除数据库通常需要审批流程。建议:

  1. 先备份再删除:mysqldump -u root -p 数据库名 > backup.sql
  2. 生产环境限制 DROP 权限:不给开发人员 DROP 数据库的权限
  3. 重命名代替删除:如果不确定是否还用,先 RENAME,过一段时间再删
  4. 删除前确认当前数据库:SELECT DATABASE(); 确认没有选错库

4.8 USE 与 SELECT DATABASE() ​

sql
-- 切换到 school 数据库
USE school;
-- Database changed

-- 查看当前选中的数据库
SELECT DATABASE();
-- +------------+
-- | DATABASE() |
-- +------------+
-- | school     |
-- +------------+

-- 不使用任何数据库
-- MySQL 没有显式"取消选择"的命令,切换到另一个库即可
USE mysql;
-- 或者创建一个虚拟的上下文(但通常不需要这样做)

如果忘记 USE,会发生什么:如果你没有选库就执行 SELECT * FROM student;,MySQL 会报错 ERROR 1046 (3D000): No database selected。所以在执行表操作前养成先 USE 的习惯,或者始终使用 数据库名.表名 的完全限定形式。


4.9 数据库命名规范与最佳实践 ​

命名规范建议 ​

规范项建议反例
字符字母、数字、下划线my-db(含连字符,需要反引号)、我的数据库(含中文)
大小写全小写(跨平台兼容,Windows 不区分大小写但 Linux 区分)MyDB、School
长度不超过 64 字符过长的名字难记忆
语义清晰表达内容db1、test、aaa
保留字避免使用 SQL 保留字database、order、table
分隔符下划线分隔单词myschooldb → 应该写成 my_school_db
复数通常用单数形式schools → 建议 school

命名示例 ​

sql
-- ✅ 好的命名
CREATE DATABASE ecommerce;           -- 商城系统
CREATE DATABASE blog_platform;       -- 博客平台
CREATE DATABASE student_management;  -- 学生管理系统
CREATE DATABASE finance_ledger;      -- 财务账本
CREATE DATABASE order_system;        -- 订单系统

-- ❌ 不好的命名
CREATE DATABASE db;                  -- 太笼统
CREATE DATABASE test;                -- 太随意(除非真的只是测试)
CREATE DATABASE 123start;            -- 以数字开头(虽合法但容易混淆)
CREATE DATABASE my-database;         -- 含有连字符(后续引用需要反引号)
CREATE DATABASE `order`;             -- 使用保留字(order 是 SQL 关键字)

关于大小写的跨平台兼容性:在 Windows 上,MySQL 数据库和表名默认是大小写不敏感的(school = School = SCHOOL)。但在 Linux 上,它们默认是大小写敏感的!这取决于 lower_case_table_names 系统变量。为了跨平台兼容,始终使用小写字母命名。

sql
-- 查看当前系统的大小写敏感设置
SHOW VARIABLES LIKE 'lower_case_table_names';
-- 0: 大小写敏感(Linux 默认)
-- 1: 大小写不敏感(Windows 默认,所有名称存储为小写)
-- 2: 存储时保留原始大小写,但比较时不区分大小写(Mac 默认)

项目开发中的实际规范 ​

以下是一个团队级别的数据库命名规范参考:

  1. 数据库命名:{项目}_env,如 shop_dev、shop_test、shop_prod
  2. 表命名:使用下划线命名法(snake_case),复数形式,如 users、order_items
  3. 列命名:使用下划线命名法,如 user_id、created_at、is_deleted
  4. 索引命名:idx_{表名}_{列名},如 idx_users_email;唯一索引 uk_{表名}_{列名}
  5. 外键命名:fk_{子表}_{父表},如 fk_order_items_orders
  6. 存储过程命名:sp_{功能描述},如 sp_create_order
  7. 函数命名:fn_{功能描述},如 fn_calc_total_price

常见错误 ​

错误 1:使用 utf8 而不是 utf8mb4 ​

现象:创建数据库时写了 CHARACTER SET utf8,后续插入 emoji 时出错。

原因:MySQL 的 utf8 不是真正的 UTF-8,只支持 3 字节字符。emoji 等需要 4 字节。

解决:始终使用 utf8mb4。

错误 2:修改数据库字符集后,已有表没有自动转换 ​

现象:

sql
ALTER DATABASE mydb CHARACTER SET utf8mb4;
-- 以为所有表都变成了 utf8mb4
INSERT INTO old_table VALUES ('😀');
-- 仍然报错!Incorrect string value

原因:ALTER DATABASE 只改变数据库的默认字符集(影响之后创建的新表),不影响已存在的表。

解决:对每个已存在的表执行 ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4;

错误 3:DROP DATABASE 之前没有备份 ​

现象:不小心执行了 DROP DATABASE production;,所有数据瞬间消失。

原因:没有回收站功能;误操作风险。

解决:

  • 删除前先备份:mysqldump -u root -p production > backup.sql
  • 使用 IF EXISTS 时小心:不要随意执行 DROP DATABASE IF EXISTS ...
  • 生产环境对 DROP 操作应有多人审批或禁用

错误 4:数据库名包含非法字符或保留字 ​

现象:

sql
CREATE DATABASE my-database;
-- 创建成功(MySQL 允许了)
USE my-database;
-- ERROR 1064 (42000): You have an error in your SQL syntax

原因:连字符 - 被 MySQL 解析为减号,造成语法错误。

解决:如果名称中真的有特殊字符,必须用反引号:USE `my-database`;。但更好的做法是避免使用特殊字符,用下划线:my_database。

错误 5:混淆 COLLATE 和 CHARACTER SET 的关系 ​

现象:创建库时只指定了 CHARACTER SET,发现排序行为和预期不一样。

原因:每个 CHARACTER SET 有对应的默认 COLLATE。如果你没指定 COLLATE,MySQL 会用该字符集的默认排序规则。

解决:始终明确指定 COLLATE,不要依赖默认值。不同 MySQL 版本的默认 COLLATE 可能不一样。


本章练习 ​

  1. 创建数据库练习:分别创建三个数据库:

    • practice_blog:字符集 utf8mb4,排序规则 utf8mb4_unicode_ci
    • practice_log:字符集 utf8mb4,排序规则 utf8mb4_bin
    • practice_legacy:字符集 latin1 创建完成后,使用 SHOW CREATE DATABASE 逐个查看它们的定义。
  2. utf8 vs utf8mb4 实验:在一个 utf8 数据库中创建一个表并尝试插入 emoji,观察错误信息。然后在 utf8mb4 数据库中做同样的事,验证成功。

  3. 大小写敏感性测试:创建一个 utf8mb4_general_ci 的表和一个 utf8mb4_bin 的表,分别插入 'Abc' 和 'abc',用 WHERE = 'Abc' 查询并比较两个表的返回结果差异。再用 ORDER BY 观察排序差异。

  4. information_schema 查询:写出一个 SQL 查询,从 information_schema.SCHEMATA 中列出所有字符集为 utf8mb4 的数据库名称、字符集和排序规则。

  5. ALTER DATABASE 陷阱:创建一个 utf8 数据库,在里面创建一张表并插入一条数据。然后 ALTER DATABASE 将该库改为 utf8mb4。用 SHOW CREATE TABLE 查看表的字符集是否改变。实验后总结 ALTER DATABASE 的作用范围。

  6. 生成 ALTER TABLE 脚本:写出一个 SELECT 语句,从 information_schema.TABLES 中生成当前数据库中所有表的 DDL 转换脚本(ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;)。

把零散知识,整理成可以反复走的路。