人人都会AI编程

7.1 数据库操作:创建、删除、字符集设置

更新时间:2026-07-11

在 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_ciutf8mb4_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 中,aA 被认为相等,排序时会排在一起;而 utf8mb4_bin 则严格按二进制比较,aA 不同。

查看服务器支持的字符集和排序规则:

SHOW CHARACTER SET;
SHOW COLLATION LIKE 'utf8mb4%';

(2) 设置级别的递进关系

MySQL 的字符集和排序规则可以设置在多个级别,作用范围由大到小,遵循就近原则:

  • 服务器级:在配置文件 my.cnf 中通过 character_set_servercollation_server 设置。对所有新建数据库生效,除非数据库另有指定。
  • 数据库级:在 CREATE DATABASE 时通过 CHARACTER SETCOLLATE 指定。若未指定则继承服务器级设置。
  • 表级:在 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 表名;

实战中,一个稳固的字符集配置是:服务器级统一为 utf8mb4utf8mb4_unicode_ci,客户端连接时指定 utf8mb4,这样在任何级别新建对象都不会出现编码问题。

通过以上内容,你应该能够安全、规范地创建和删除数据库,并正确配置字符集,为后续的表与数据操作打好基础。