在 MySQL 中创建数据库,本质是执行一条 DDL 语句,语法以 CREATE DATABASE 开头。基础格式如下:CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集] [COLLATE 排序规则]。虽然看起来简单,但如果不注意字符集和权限,后续建表、写入中文数据时会出现乱码或连接报错。下面先拆解这条语句的核心参数。

一、CREATE DATABASE 基础语法与参数说明
MySQL 创建数据库的完整语法如下:
CREATE DATABASE [IF NOT EXISTS] database_name [[DEFAULT] CHARACTER SET [=] charset_name] [[DEFAULT] COLLATE [=] collation_name];
其中 database_name 是数据库名称,不能与现有库重名,也不能包含路径分隔符、点号等特殊字符。方括号里的 IF NOT EXISTS 是可选项,表示仅在数据库不存在时创建,如果库已经存在则不会报错。这个参数在自动化脚本里非常有用,可以让初始化脚本重复执行而不中断。
CHARACTER SET 用来指定库的默认字符集,COLLATE 用来指定默认排序规则。字符集决定数据存储时如何编码,排序规则决定比较和排序时的大小写、重音是否敏感。MySQL 8.0 默认推荐使用 utf8mb4,它是真正的 UTF-8 实现,能够存储 Emoji 等四字节字符,而旧的 utf8 在 MySQL 中实际上最多只支持三字节。
需要注意,如果不写 CHARACTER SET,新库会继承服务端变量 character_set_server 的值。很多 Linux 发行版默认会配置为 latin1,这会导致中文写入后变成问号或乱码,所以生产环境建议显式声明。
二、实际创建示例与字符集搭配
下面创建一个订单系统的数据库,明确指定字符集和排序规则:
CREATE DATABASE IF NOT EXISTS order_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_0900_ai_ci;
这条语句表示创建名为 order_db 的库,如果已存在则跳过。字符集使用 utf8mb4,排序规则使用 utf8mb4_0900_ai_ci。其中 0900 表示该规则基于 Unicode 9.0 规范,ai 表示重音不敏感,ci 表示大小写不敏感。
如果想要更紧凑的排序规则,也可以使用 utf8mb4_general_ci,它的比较速度稍快,但对部分字符的排序精度不如 utf8mb4_unicode_ci 和 utf8mb4_0900_ai_ci。在 MySQL 5.7 中通常没有 utf8mb4_0900_ai_ci,可以选择 utf8mb4_unicode_ci。
创建完成后,可以通过以下命令查看数据库的定义,确认字符集是否生效:
SHOW CREATE DATABASE order_db;
输出中会包含 CREATE DATABASE `order_db` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ 这样的信息。这里反引号不是注释,而是 MySQL 用来包裹标识符的定界符。
三、命令行与客户端中的执行方式
在命令行客户端中,可以先通过 mysql -u root -p 登录,再执行创建语句。示例如下:
mysql> CREATE DATABASE test_db
-> DEFAULT CHARACTER SET utf8mb4
-> DEFAULT COLLATE utf8mb4_0900_ai_ci;
Query OK, 1 row affected (0.01 sec)
命令行中 > 和 -> 是客户端提示符。实际输入时只需要输入语句本身,分号表示语句结束。Query OK 表示执行成功,后面显示影响的行数和耗时。
如果使用图形化客户端,例如 MySQL Workbench 或 Navicat,通常只需要在查询窗口中粘贴 SQL 并执行。部分客户端也提供可视化新建数据库的界面,但底层最终执行的仍然是 CREATE DATABASE 语句。
执行创建数据库操作需要登录用户拥有 CREATE 权限。普通应用账号通常不需要创建库,只对指定库有读写权限即可。管理员可以用如下语句授权:
GRANT ALL PRIVILEGES ON new_db.* TO 'app_user'@'localhost'; FLUSH PRIVILEGES;
这条语句把 new_db 库下所有表的管理权限授予 app_user,限定仅本机登录。生产环境建议按最小权限原则授权,应用账号只给 SELECT、INSERT、UPDATE、DELETE 等必要权限,而不是直接给 ALL PRIVILEGES。
四、常见错误与数据库命名规范
最常见的错误是 1007,对应错误提示:Can't create database 'order_db'; database exists。表示目标库已经存在。如果在脚本中不希望中断,可以使用 IF NOT EXISTS 来抑制这个错误。但要注意,IF NOT EXISTS 只避免报错,不会更新已有库的字符集或排序规则。
另一个常见错误是 1064 语法错误,通常是因为数据库名使用了 MySQL 保留字,或者名称中包含短横线等特殊字符。此时可以用反引号包裹标识符,例如:
CREATE DATABASE `order-db` DEFAULT CHARACTER SET utf8mb4;
虽然技术上可行,但不推荐在数据库名中使用短横线或空格,因为后期在命令行、脚本和代码中都需要额外加反引号或引号,容易出错。
命名规范建议统一使用小写字母、数字和下划线,长度不要超过 30 个字符。例如 user_center、payment_gateway、log_archive 都是清晰且兼容性较好的命名。名称应体现业务含义,避免使用 test、db1 这类无意义名称。
五、创建数据库后的相邻操作
数据库创建后,通常需要切换到该库再建表。可以用 USE 语句切换当前数据库:
USE order_db; CREATE TABLE orders ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(40) NOT NULL, amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
这里建表时也建议显式指定 DEFAULT CHARSET=utf8mb4。虽然表会继承库的字符集,但显式声明可以让建表语句更自解释,尤其当数据库被迁移或结构导出时,不会丢失编码信息。
如果发现已建库的字符集不符合要求,可以使用 ALTER DATABASE 修改默认字符集:
ALTER DATABASE order_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
需要注意,修改数据库默认字符集只影响之后新建的表,不会改变已有表的数据编码。已有表需要单独使用 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci 来转换。
删除数据库使用 DROP DATABASE,例如 DROP DATABASE IF EXISTS order_db;。该操作不可逆,执行前必须确认备份。创建数据库只是数据库设计的第一步,但合理的字符集、排序规则和权限规划,能让后续开发、迁移和运维少踩很多坑。
MySQL创建数据库CREATE DATABASE数据库语句修改时间:2026-09-20 03:42:20