创建数据库(CREATE DATABASE

  1. CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
  2. [create_specification] ...
  3. create_specification:
  4. [DEFAULT] CHARACTER SET [=] charset_name
  5. | [DEFAULT] COLLATE [=] collation_name
  • CREATE DATABASE创建具有给定名称的数据库。要使用此语句,您需要数据库的 CREATE 特权。CREATE SCHEMACREATE DATABASE 的同义词。
  • 如果数据库存在,并且您没有指定IF NOT EXISTS,则会发生错误。
  • 在具有活跃LOCK TABLES表语句的会话中,不允许CREATE DATABASE。(https://www.yuque.com/kylinxiang/mysql/lock-unlock#8f6fc301
  • create_specification选项指定数据库特性。数据库特征存储在数据库目录的 db.opt 文件中。CHARACTER SET子句指定默认数据库字符集。COLLATE 子句指定默认的数据库排序规则。官方文档Character Sets, Collations, Unicode,讨论字符集和排序规则名称。
  • MySQL 中的数据库被实现为包含与数据库中的表相对应的文件的目录。因为最初创建数据库时数据库中没有表,所以 CREATE DATABASE 语句只在 MySQL 数据目录下创建一个目录和 db.opt 文件。允许数据库名称的规则在官方文档“Schema Object Names” 中给出。如果数据库名称包含特殊字符,则数据库目录的名称包含官方文档“Mapping of Identifiers to File Names” 中描述的这些字符的编码版本。
  • 如果在数据目录下手动创建目录 (例如,使用 mkdir),服务器将其视为数据库目录,并显示在 SHOW DATABASE 的输出中。
  • MySQL 对数据库的数量没有限制。底层文件系统可能对目录的数量有限制。
  • 您也可以使用 mysqladmin 程序创建数据库。参见官方文档“mysqladmin — Client for Administering a MySQL Server”

    修改数据库(ALTER DATABASE

    ```sql ALTER {DATABASE | SCHEMA} [db_name] alter_specification … ALTER {DATABASE | SCHEMA} db_name UPGRADE DATA DIRECTORY NAME

alter_specification: [DEFAULT] CHARACTER SET [=] charset_name | [DEFAULT] COLLATE [=] collation_name

  1. 使用 `ALTER DATABASE` 可以更改数据库的整体特性。这些特性存储在数据库目录的 `db.opt` 文件中。要使用 `ALTER` 数据库,您需要数据库上的 `ALTER` 特权。`ALTER SCHEMA` `ALTER DATABASE` 的同义词。<br />数据库名称可以从第一个语法中省略,在这种情况下,语句适用于默认数据库。
  2. <a name="NslUF"></a>
  3. ### 国家语言特征
  4. `CHARACTER SET`子句更改默认数据库字符集。`COLLATE` 子句更改默认的数据库排序规则。[官方文档Character Sets, Collations, Unicode](https://dev.mysql.com/doc/refman/5.7/en/charset.html),讨论字符集和排序规则名称。<br />您可以分别使用`SHOW CHARACTER SET`和` SHOW COLLATION` 语句来查看哪些字符集和排序规则可用。有关更多信息,参考[“SHOW CHARACTER SET Statement”](https://dev.mysql.com/doc/refman/5.7/en/show-character-set.html), 和 [“SHOW COLLATION Statement”](https://dev.mysql.com/doc/refman/5.7/en/show-collation.html)。<br />如果更改数据库的默认字符集或排序规则,则必须删除和重新创建使用数据库默认值的stored routines,以便它们使用新的默认值。(在stored routines中,如果没有显式指定字符集或排序规则,则具有字符数据类型的变量使用数据库默认值。参考[“CREATE PROCEDURE and CREATE FUNCTION Statements”](https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html).)
  5. <a name="tHIER"></a>
  6. ### 从早于 MySQL 5.1 的版本升级
  7. 包含`UPGRADE DATA DIRECTORY NAME` 子句的语法将更新与数据库关联的目录的名称,以便使用 MySQL 5.1 中实现的编码将数据库名称映射到数据库目录名称 (参考[“Mapping of Identifiers to File Names”](https://dev.mysql.com/doc/refman/5.7/en/identifier-mapping.html))。,“标识符到文件名的映射”)。本条款在以下条件下使用:
  8. - 它是从旧版本升级 MySQL 5.1 或更高版本时使用的。
  9. - 如果数据库目录名称包含需要编码的特殊字符,则旨在将其更新为当前编码格式。
  10. - 该语句由 `mysqlcheck` 使用 (由 `mysql_upgrade` 调用)。
  11. 例如,如果 MySQL 5.0 中的数据库名称为 `a-b-c`,则该名称包含-(破折号) 字符的实例。在 MySQL 5.0 中,数据库目录也被命名为 `a-b-c`,这对于所有文件系统来说并不一定是安全的。在 MySQL 5.1 及更高版本中,相同的数据库名称被编码为 `a@002db@002dc`,以产生文件系统中性目录名称。<br />当 MySQL 安装从旧版本升级到 MySQL 5.1 或更高版本时,服务器显示一个名称,如 `a-b-c` (采用旧格式) 作为 `#mysql50#a-b-c``您必须使用 #mysql50#` 前缀引用名称。在这种情况下,使用`UPGRADE DATA DIRECTORY NAME`显式告诉服务器将数据库目录名重新编码为当前编码格式:
  12. ```sql
  13. ALTER DATABASE `#mysql50#a-b-c` UPGRADE DATA DIRECTORY NAME;

执行此语句后,您可以将数据库称为 a-b-c,而不使用特殊的 #mysql50# 前缀。
NOTEUPGRADE DATA DIRECTORY NAME子句在 MySQL 5.7.6 中已弃用,并将在 MySQL 的未来版本中删除。如果需要转换 MySQL 5.0 数据库或表名,解决方法是在升级到最新版本之前将 MySQL 5.0 安装升级到 MySQL 5.1。

删除数据库(DROP DATABASE

  1. DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

DROP DATABASE会删除数据库中的所有表并删除数据库。对此语句要非常小心!要使用 DROP DATABASE,您需要数据库上的 DROP 权限。DROP SCHEMADROP DATABASE的同义词。
重要删除数据库时,不会自动删除专门为数据库授予的权限。它们必须手动丢弃。参考:“GRANT Statement”

如果数据库不存在,IF EXISTS用于防止发生错误。
如果删除了默认数据库,则取消设置默认数据库 (DATABASE() 函数返回 NULL)。
如果在象征性链接的数据库(symbolically linked database)上使用 DROP DATABASE,则链接和原始数据库都会被删除。
DROP DATABASE 返回已删除的表的数量。这对应于.Frm 文件被删除的数量。
DROP DATABASE 语句从给定的数据库目录中删除 MySQL 在正常操作过程中可能创建的文件和目录:

  • 具有以下扩展名的所有文件:
    • .BAK
    • .DAT
    • .HSH
    • .MRG
    • .MYD
    • .MYI
    • .TRG
    • .TRN
    • .cfg
    • .db
    • .frm
    • .ibd
    • .ndb
    • .par
  • db.opt 文件, 如果存在的话。

如果在 MySQL 删除刚刚列出的文件或目录后,其他文件或目录仍保留在数据库目录中,则无法删除数据库目录。在这种情况下,您必须手动删除所有剩余的文件或目录,并再次发出 DROP DATABASE 语句。
删除数据库不会删除在该数据库中创建的任何临时表。创建临时表的会话结束时,将自动删除这些表。参考:“CREATE TEMPORARY TABLE Statement”.
您也可以使用 mysqladmin 删除数据库。参考:mysqladmin — Client for Administering a MySQL Server”