第4章:数据库操作
本章目标
学完本章后,你将能够:
- 使用 CREATE DATABASE 创建数据库并指定字符集和排序规则
- 深刻理解字符集(charset)和排序规则(collation)的概念,尤其是 utf8 与 utf8mb4 的著名陷阱
- 使用 ALTER DATABASE 修改数据库属性,使用 DROP DATABASE 删除数据库
- 通过 SHOW 命令查看数据库的定义、字符集、排序规则等元信息
- 遵循数据库命名规范,避免常见的坑
前置知识
- 第1章:理解数据库、DBMS 等基本概念
- 第3章:能使用 mysql 客户端连接 MySQL,会用 SHOW、USE 等命令
4.1 CREATE DATABASE 创建数据库
完整语法
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] 数据库名
[DEFAULT] CHARACTER SET [=] 字符集名
[DEFAULT] COLLATE [=] 排序规则名;DATABASE和SCHEMA在 MySQL 中是同义词,用哪个都可以[方括号]中的内容是可选的DEFAULT关键字在 MySQL 中可以省略
最简单的创建
-- 创建一个名为 school 的数据库(使用服务器的默认字符集和排序规则)
CREATE DATABASE school;
-- Query OK, 1 row affected (0.01 sec)但这创建出来的数据库使用的是什么字符集呢?
-- 查看服务器默认字符集
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 避免错误
-- 没有 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,这样脚本可以安全地重复执行而不会因"数据库已存在"而中断。
指定字符集和排序规则
-- 创建数据库并明确指定字符集为 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 支持的字符集
-- 查看 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 内的罕见汉字)
- 一些历史文字、音乐符号等
-- 验证 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 ('😀'); -- ✅ 正常!# 用 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) 决定了两件事:
- 字符串如何比较(WHERE 条件中的 =、>、<)
- 字符串如何排序(ORDER BY)
一个字符集可以有多个排序规则。排序规则的命名通常遵循:字符集名_语言_比较类型。
常见的排序规则后缀
| 后缀 | 含义 | 示例 |
|---|---|---|
_ci | Case Insensitive(大小写不敏感) | utf8mb4_general_ci |
_cs | Case Sensitive(大小写敏感) | utf8mb4_0900_as_cs |
_bin | Binary(按二进制字节值比较,大小写敏感) | utf8mb4_bin |
_ai | Accent Insensitive(重音不敏感) | utf8mb4_0900_ai_ci |
_as | Accent 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 |
大小写敏感性演示
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 |
-- +-------+-- 对比 _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附近等)。
查看可用的排序规则
-- 查看所有排序规则
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 数据库操作示例集
创建不同字符集和排序规则的数据库
-- 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
-- 查看某个数据库的创建语句(最完整的信息)
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。这是一种跨版本兼容的技巧。
查看所有数据库及其字符集
-- 方式一:通过 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 过滤
-- 查看所有以 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 主要用于修改数据库的字符集和排序规则。
ALTER DATABASE 数据库名
[DEFAULT] CHARACTER SET [=] 字符集名
[DEFAULT] COLLATE [=] 排序规则名;修改示例
-- 查看当前字符集
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 不会转换已有数据
-- 场景:原来用 utf8 建的库,想升级到 utf8mb4
ALTER DATABASE old_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;这只改变了数据库的默认字符集! 之前创建的表、表中的列,它们仍然是 utf8!插入 emoji 仍然会报错!
要彻底转换已有表,需要逐表操作:
-- 方法一:逐表修改
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 删除数据库
DROP {DATABASE | SCHEMA} [IF EXISTS] 数据库名;-- 删除数据库
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 没有"回收站"或"垃圾桶"功能!
删除后数据无法恢复(除非有备份)!在公司环境中,删除数据库通常需要审批流程。建议:
- 先备份再删除:
mysqldump -u root -p 数据库名 > backup.sql - 生产环境限制 DROP 权限:不给开发人员 DROP 数据库的权限
- 重命名代替删除:如果不确定是否还用,先
RENAME,过一段时间再删 - 删除前确认当前数据库:
SELECT DATABASE();确认没有选错库
4.8 USE 与 SELECT DATABASE()
-- 切换到 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 |
命名示例
-- ✅ 好的命名
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系统变量。为了跨平台兼容,始终使用小写字母命名。
-- 查看当前系统的大小写敏感设置
SHOW VARIABLES LIKE 'lower_case_table_names';
-- 0: 大小写敏感(Linux 默认)
-- 1: 大小写不敏感(Windows 默认,所有名称存储为小写)
-- 2: 存储时保留原始大小写,但比较时不区分大小写(Mac 默认)项目开发中的实际规范
以下是一个团队级别的数据库命名规范参考:
- 数据库命名:
{项目}_env,如shop_dev、shop_test、shop_prod - 表命名:使用下划线命名法(snake_case),复数形式,如
users、order_items - 列命名:使用下划线命名法,如
user_id、created_at、is_deleted - 索引命名:
idx_{表名}_{列名},如idx_users_email;唯一索引uk_{表名}_{列名} - 外键命名:
fk_{子表}_{父表},如fk_order_items_orders - 存储过程命名:
sp_{功能描述},如sp_create_order - 函数命名:
fn_{功能描述},如fn_calc_total_price
常见错误
错误 1:使用 utf8 而不是 utf8mb4
现象:创建数据库时写了 CHARACTER SET utf8,后续插入 emoji 时出错。
原因:MySQL 的 utf8 不是真正的 UTF-8,只支持 3 字节字符。emoji 等需要 4 字节。
解决:始终使用 utf8mb4。
错误 2:修改数据库字符集后,已有表没有自动转换
现象:
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:数据库名包含非法字符或保留字
现象:
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 可能不一样。
本章练习
创建数据库练习:分别创建三个数据库:
practice_blog:字符集 utf8mb4,排序规则 utf8mb4_unicode_cipractice_log:字符集 utf8mb4,排序规则 utf8mb4_binpractice_legacy:字符集 latin1 创建完成后,使用SHOW CREATE DATABASE逐个查看它们的定义。
utf8 vs utf8mb4 实验:在一个
utf8数据库中创建一个表并尝试插入 emoji,观察错误信息。然后在utf8mb4数据库中做同样的事,验证成功。大小写敏感性测试:创建一个
utf8mb4_general_ci的表和一个utf8mb4_bin的表,分别插入'Abc'和'abc',用WHERE = 'Abc'查询并比较两个表的返回结果差异。再用ORDER BY观察排序差异。information_schema 查询:写出一个 SQL 查询,从
information_schema.SCHEMATA中列出所有字符集为utf8mb4的数据库名称、字符集和排序规则。ALTER DATABASE 陷阱:创建一个
utf8数据库,在里面创建一张表并插入一条数据。然后ALTER DATABASE将该库改为utf8mb4。用SHOW CREATE TABLE查看表的字符集是否改变。实验后总结 ALTER DATABASE 的作用范围。生成 ALTER TABLE 脚本:写出一个 SELECT 语句,从
information_schema.TABLES中生成当前数据库中所有表的 DDL 转换脚本(ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;)。