参数说明

参数 说明
CREATE DATABASE 创建具有给定名称的数据库
CREATE SCHEMA 这是 CREATE DATABASE 的同义词
IF NOT EXISTS 用于避免在指定数据库已存在时执行出错
create_specification 指定数据库特性,如 CHARACTER SET 和 COLLATE

第 7.1 节:创建数据库、用户和授权

创建一个数据库。注意,缩写词 SCHEMA 可用作同义词。

CREATE DATABASE Baseball;   -- 创建一个名为 Baseball 的数据库

如果数据库已存在,将返回错误 1007。要避免此错误,可以使用:

CREATE DATABASE IF NOT EXISTS Baseball;

类似地:

DROP DATABASE IF EXISTS Baseball;   -- 如果存在则删除数据库,避免错误 1008
DROP DATABASE xyz;                  -- 如果 xyz 不存在,将发生错误 1008

由于上述错误可能性,DDL 语句常与 IF EXISTS 一起使用。

可以创建带有默认 CHARACTER SET 和 collation 的数据库。例如:

CREATE DATABASE Baseball CHARACTER SET utf8 COLLATE utf8_general_ci;

查看数据库创建语句:

SHOW CREATE DATABASE Baseball;

结果示例:

+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| Baseball | CREATE DATABASE `Baseball` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------------+

查看当前数据库:

SHOW DATABASES;

结果示例:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| ajax_stuff         |
| Baseball           |
+--------------------+

设置当前活动数据库,并查看一些信息:

USE Baseball;   -- 将其设置为当前数据库

SELECT @@character_set_database AS cset, @@collation_database AS col;

结果示例:

+------+-----------------+
| cset | col             |
+------+-----------------+
| utf8 | utf8_general_ci |
+------+-----------------+

以上显示了数据库的默认 CHARACTER SET 和 Collation。

创建一个用户:

CREATE USER 'John123'@'%' IDENTIFIED BY 'OpenSesame';

上述命令创建用户 John123,由于使用了 % 通配符,该用户可以从任何主机名连接。用户密码设置为 'OpenSesame',该密码会被哈希存储。

再创建另一个用户:

CREATE USER 'John456'@'%' IDENTIFIED BY 'somePassword';

通过检查特殊的 mysql 数据库来显示用户已被创建:

SELECT user, host, password FROM mysql.user WHERE user IN ('John123','John456');

结果示例(密码显示为哈希值,实际输出可能不同):

+---------+------+-------------------------------------------+
| user    | host | password                                  |
+---------+------+-------------------------------------------+
| John123 | %    | *B04E11FAAAEA9A...                        |
| John456 | %    | *B04E11FAAAEA9A...                        |
+---------+------+-------------------------------------------+

注意,此时用户已创建,但尚未拥有使用 Baseball 数据库的任何权限。

处理用户和数据库的权限。授予用户 John123 对 Baseball 数据库的全部权限,并授予另一用户仅 SELECT 权限:

GRANT ALL ON Baseball.* TO 'John123'@'%';
GRANT SELECT ON Baseball.* TO 'John456'@'%';

验证上述授权:

SHOW GRANTS FOR 'John123'@'%';

结果示例:

+--------------------------------------------------------------------------------------------------------------+
| Grants for John123@%                                                                                         |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'John123'@'%' IDENTIFIED BY PASSWORD '*B04E11FAAAEA9A...'                              |
| GRANT ALL PRIVILEGES ON `Baseball`.* TO 'John123'@'%'                                                        |
+--------------------------------------------------------------------------------------------------------------+
SHOW GRANTS FOR 'John456'@'%';

结果示例:

+--------------------------------------------------------------------------------------------------------------+
| Grants for John456@%                                                                                         |
+--------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'John456'@'%' IDENTIFIED BY PASSWORD '*B04E11FAAAEA9A...'                              |
| GRANT SELECT ON `Baseball`.* TO 'John456'@'%'                                                                |
+--------------------------------------------------------------------------------------------------------------+

注意,你总会看到的 GRANT USAGE 仅仅意味着用户可以登录。仅此而已。

第 7.2 节:创建和选择数据库

如果管理员在设置权限时为你创建了数据库,你可以直接开始使用。否则,你需要自己创建:

mysql> CREATE DATABASE menagerie;

在 Unix 下,数据库名称是区分大小写的(与 SQL 关键字不同),因此你必须始终将数据库引用为 menagerie,而不是 Menagerie、MENAGERIE 或其他变体。表名也是如此。(在 Windows 下,此限制不适用,尽管在给定的查询中,你仍必须使用与创建数据库时相同的大小写来引用数据库和表。然而,出于多种原因,推荐的最佳实践是始终使用与创建数据库时相同的大小写。)

创建数据库并不会自动选择它供使用;你必须显式地执行此操作。要将 menagerie 设为当前数据库,请使用以下语句:

mysql> USE menagerie
Database changed

你的数据库只需要创建一次,但每次开始 mysql 会话时都必须选择它供使用。你可以像示例中那样发出 USE 语句来实现。或者,你可以在调用 mysql 时在命令行上选择数据库。只需在任何可能需要的连接参数之后指定数据库名称。例如:

shell> mysql -h host -u user -p menagerie
Enter password: ********

第 7.3 节:我的数据库

你必须创建自己的数据库,不要写入任何现有数据库。这可能是首次连接后首先要做的事情之一。

CREATE DATABASE my_db;
USE my_db;
CREATE TABLE some_table;

你可以通过使用数据库名称限定来引用表:my_db.some_table。

第 7.4 节:系统数据库

以下数据库供 MySQL 自身使用。你可以读取(SELECT)它们,但不得写入(INSERT/UPDATE/DELETE)其中的表。(有一些例外。)

  • mysql —— 存储 GRANT 信息和其他一些内容。
  • information_schema —— 这里的表是“虚拟”的,实际上是通过内存结构实现的。它们的内容包括所有表的架构(schema)。
  • performance_schema —— ??
  • 其他(用于 MariaDB、Galera、TokuDB 等)