
create database 语句的基本写法
MySQL 创建数据库最直接的方式就是 CREATE DATABASE,不是 CREATE SCHEMA(虽然二者等价),也不是靠图形界面点出来的。它本质是一条 DDL 语句,执行后会生成一个独立的数据库目录(在默认存储引擎和配置下)。
最简写法:
CREATE DATABASE mydb;
- 不加任何修饰时,MySQL 使用服务器默认字符集(通常是
latin1或utf8mb4,取决于版本和配置),这点极易被忽略,导致后续插入中文报错或乱码 - 数据库名不能是 MySQL 保留字(如
order、group),否则必须用反引号包裹:`order` - 如果数据库已存在,该语句直接报错:
ERROR 1007 (HY000): Can't create database 'mydb'; database exists
避免报错:用 IF NOT EXISTS 和显式指定字符集
生产环境几乎从不裸写 CREATE DATABASE mydb;,因为脚本重复执行会中断。必须加 IF NOT EXISTS;同时字符集必须显式声明,否则不同环境行为不一致。
推荐写法:
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-
IF NOT EXISTS让语句幂等,不存在则建,存在则静默跳过,不会报错 -
utf8mb4是 MySQL 中真正支持完整 Unicode(包括 emoji、生僻汉字)的字符集;utf8是残缺实现,最多存 3 字节,别用 -
utf8mb4_unicode_ci排序规则比utf8mb4_general_ci更准确,尤其对多语言排序和大小写敏感场景 - 注意等号
=可省略,但加上更清晰,避免和旧语法混淆
创建时指定用户权限不是 CREATE DATABASE 的事
很多人以为 CREATE DATABASE 能顺便授权,比如“建库并让 userA 有所有权限”——这不可能。CREATE DATABASE 只管库结构,权限必须单独用 GRANT 设置。
- 建库后立刻授权的标准组合是两步:
CREATE DATABASE IF NOT EXISTS mydb CHARACTER SET utf8mb4;
GRANT ALL ON mydb.* TO 'userA'@'localhost';
- 如果只给部分权限(比如只要查询),就别用
ALL,改用SELECT, INSERT等具体权限项 - 用户主机名(
'userA'@'localhost'中的localhost)必须和实际连接来源匹配,'%'虽方便但有安全风险,别在生产库乱用
字符集和排序规则一旦设错,后期修改很麻烦
数据库创建时的 CHARACTER SET 和 COLLATE 会影响后续所有新建表的默认值。如果建库时没设对,之后每个表都得单独指定,非常容易遗漏。
- 改库级字符集不能只改数据库本身:
ALTER DATABASE mydb CHARACTER SET = utf8mb4;只影响新表,已有表和字段不变 - 要彻底修正,得逐个
ALTER TABLE修改表和字段,还可能触发全表重建,大表慎操作 - 所以建库那条命令,就是唯一靠谱的“设对一次,省事到底”的机会
事情说清了就结束。










