在 MySQL 中,数据库(Database)是一个逻辑容器,用于组织和管理表、视图、存储过程等对象。每个数据库在文件系统上通常对应一个目录,目录下存放着表结构文件(.ibd 等)。掌握数据库的创建、删除与字符集配置,是后续一切表设计与数据操作的前提。
7.1.1 创建数据库
创建数据库的基本语法如下:
CREATE DATABASE [IF NOT EXISTS] 数据库名
[DEFAULT CHARACTER SET 字符集名称]
[DEFAULT COLLATE 排序规则名称];
常用示范:
-- 最简单的方式,使用服务器默认字符集
CREATE DATABASE my_test;
-- 安全写法:仅当数据库不存在时才创建,避免报错
CREATE DATABASE IF NOT EXISTS my_app;
-- 完整写法:明确指定字符集和排序规则
CREATE DATABASE my_shop
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
关键字解释:
IF NOT EXISTS:这是一个非常实用的选项。当你不确定数据库是否已存在时(比如在脚本中重复执行建库语句),加上它可以防止因重复创建而抛出错误。省略时,如果数据库已存在会直接报错:Can't create database 'xxx'; database exists。CHARACTER SET:指定数据库级别的默认字符集。数据库中的所有表、列如果没有单独指定字符集,都会继承这个设置。COLLATE:指定数据库级别的默认排序规则。它决定了字符串如何比较和排序(例如是否区分大小写、是否区分重音)。一个字符集通常对应多种排序规则,需根据业务选择。
实用要点:
- 字符集强烈建议使用
utf8mb4。MySQL 中的utf8是阉割版的 UTF-8,最多只支持 3 字节,无法存储 emoji 表情(如😀)和一些不常用汉字。utf8mb4才是真正的 UTF-8,支持 4 字节,兼容全部 Unicode 字符。从 MySQL 8.0 开始,默认字符集已是utf8mb4。 - 排序规则推荐
utf8mb4_unicode_ci或utf8mb4_general_ci。_ci表示大小写不敏感(Case Insensitive),适合大多数业务。unicode_ci基于 Unicode 标准,排序更准确但稍慢;general_ci更快但部分语言排序不够精确。对于互联网应用,通常utf8mb4_general_ci足够用,注意区分大小写的场景(如密码、令牌)可在查询中使用BINARY修饰符或为特定列设置utf8mb4_bin。 CREATE DATABASE需要相应权限:通常是CREATE权限。管理员分配权限时可将该权限限定在全局级别。
创建数据库后,可以使用 USE 数据库名 命令切换到该数据库,后续所有操作都将在这个默认数据库下执行。
USE my_shop;
查看当前数据库:
SELECT DATABASE();
查看现有所有数据库:
SHOW DATABASES;
7.1.2 删除数据库
删除数据库的语法很简单,但威力巨大,务必谨慎:
DROP DATABASE [IF EXISTS] 数据库名;
示例:
DROP DATABASE IF EXISTS my_test;
IF EXISTS:与创建时类似,当数据库不存在时不会报错,只是产生一个警告。这在清理脚本中非常有用。- 危险操作:
DROP DATABASE会物理删除该数据库对应的整个目录以及其中的所有表、数据、索引、视图、存储过程等,且不可恢复(除非有备份)。在生产环境执行前务必确认两件事:第一,你真的可以删;第二,有最近的有效备份。 - 权限要求:需要有该数据库的
DROP权限。
安全建议:在执行删除前,可以先使用 SHOW DATABASES LIKE '数据库名' 确认名称正确;若使用 GUI 工具,尽量通过图形界面勾选确认,避免手误。
如果你的意图是删除库内所有表但保留数据库本身,那就应该逐表删除或使用脚本,而不是用 DROP DATABASE。
7.1.3 字符集与排序规则设置
字符集和排序规则是 MySQL 中容易踩坑但极其重要的概念,它们直接影响数据的正确存储和查询的准确性。
(1) 字符集与排序规则的关系
- 字符集(Character Set):定义了哪些字符可以存储以及如何编码为二进制。比如
utf8mb4字符集可以存储全球几乎所有文字和表情。 - 排序规则(Collation):在某个字符集下,定义字符的比较和排序规则。比如
utf8mb4_general_ci中,a和A被认为相等,排序时会排在一起;而utf8mb4_bin则严格按二进制比较,a和A不同。
查看服务器支持的字符集和排序规则:
SHOW CHARACTER SET;
SHOW COLLATION LIKE 'utf8mb4%';
(2) 设置级别的递进关系
MySQL 的字符集和排序规则可以设置在多个级别,作用范围由大到小,遵循就近原则:
- 服务器级:在配置文件
my.cnf中通过character_set_server和collation_server设置。对所有新建数据库生效,除非数据库另有指定。 - 数据库级:在
CREATE DATABASE时通过CHARACTER SET和COLLATE指定。若未指定则继承服务器级设置。 - 表级:在
CREATE TABLE时指定,覆盖数据库默认值。 - 列级:在列定义中指定,覆盖表默认值。
例如,一个列的字符集最终由:列定义 > 表定义 > 数据库定义 > 服务器定义。这种层级设计让你可以在最合适的位置定义默认值,同时保留对特殊列的精确控制。
(3) 修改已有数据库的字符集
若数据库已存在但字符集设置错误,可以用 ALTER DATABASE 修改:
ALTER DATABASE 数据库名
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
注意:这条命令只影响此后新建的表,已存在的表仍然保留它们创建时的字符集。要修改已有表的字符集,需要对每张表执行 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;,这会同时转换表中已有数据的编码。
建议在项目初期就明确并锁定字符集,中途更换代价较高。
(4) 常见问题与实战建议
- 乱码问题:通常是因为客户端连接字符集与服务器实际存储字符集不匹配。可以通过
SET NAMES utf8mb4告知服务器客户端使用的字符集,或者在连接字符串中指定characterEncoding=utf8mb4。 - emoji 存储失败(Incorrect string value):一般是由于使用了
utf8而非utf8mb4。解决方法是确认库、表、连接均为utf8mb4。 - 大小写敏感:如果某些列需要严格区分大小写,可以设置为
utf8mb4_bin。也可以在查询时使用WHERE column = BINARY 'value'临时强制二进制比较。 - 查看各对象字符集:
- 数据库:
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '库名'; - 表:
SHOW TABLE STATUS FROM 库名; - 列:
SHOW FULL COLUMNS FROM 表名;
实战中,一个稳固的字符集配置是:服务器级统一为 utf8mb4 和 utf8mb4_unicode_ci,客户端连接时指定 utf8mb4,这样在任何级别新建对象都不会出现编码问题。
通过以上内容,你应该能够安全、规范地创建和删除数据库,并正确配置字符集,为后续的表与数据操作打好基础。