创建数据库

数据库是存储数据的容器。一个数据中可以包含多个表。要想创建表,必须首先创建数据库。

在 MySQL 中,CREATE DATABASECREATE SCHEMA 语句用来创建数据库。

创建数据库语法

CREATE DATABASE 语句用来创建数据库。以下是 CREATE DATABASE 语句的语法:

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option:[DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {'Y' | 'N'}
}

语法说明:

关键字参数说明是否可选
CREATE DATABASECREATE SCHEMAdb_name两者产生效果一致,参数为创建数据库的名称必填
IF NOT EXISTS-表示指定的数据库不存在的情况下才创建可选
CHARACTER SET <charset_name>charset_name指定数据库的字符集(默认使用数据库服务器的配置)可选
COLLATE <collation_name>collation_name指定数据库的排序规则(默认使用数据库服务器的配置)可选
ENCRYPTION'Y' | 'N'指定数据库是否加密(默认使用数据库服务器的配置)可选

数据库命名要求:

  • 数据库的名字最长为 64 个字符,名字的长度还取决于操作系统
  • 数据库名可以由子吗、数字、下划线、美元符号组成

虽然语法看起来复杂,但最常用的就是下面这句:

CREATE DATABASE db_name;

官方文档:CREATE DATABASE Statement

字符集

MySQL数据库支持多种字符集,字符集决定了数据库可以存储哪些字符。在 MySQL 中,字符集主要用于指定表、列或者数据库可以存储的字符类型。以下是MySQL中一些常见的字符集类型及其说明:

  • UTF-8系列:
    • utf8mb4:是一种最常用的字符集,支持存储 Unicode 字符,可以存储任何语言的字符,包括表情符号。utf8mb4 是 utf8 的超集,支持更多的字符,特别是 4 字节的 Unicode 字符。
    • utf8:早期版本的 MySQL 使用 utf8作为默认字符集,但它不支持 4 字节的 Unicode 字符,因此不能存储所有 Unicode 字符,如一些表情符号。
  • Latin系列:
    • latin1:也称为 ISO 8859-1,是西欧语言的字符集,包括英文和大多数西欧语言。
    • latin2:也称为 ISO 8859-2,用于中欧和东欧的一些语言,如波兰语、捷克语等。
  • GBK系列:
    • gb2312:用于简体中文字符的字符集。
    • gbk:是 gb2312 的扩展,添加了更多的中文字符。
  • Big5:用于繁体中文字符的字符集。
  • ASCII:美国标准信息交换码,只支持英文字符和一些特殊字符。
  • Unicode系列:
    • ucs2:一个固定长度的 Unicode 字符集,每个字符使用2字节表示。
    • utf16:类似于 ucs2,但支持使用一对代理项来表示超出基本多语言平面的字符。
    • utf32:一个固定长度的字符集,每个 Unicode 字符使用 4 字节表示,支持 Unicode 标准的所有字符。

每种字符集都有其特定的用途和支持的语言范围。选择合适的字符集对于存储和处理国际化数据是非常重要的。例如,如果你的应用需要处理多语言数据,包括表情符号等,utf8mb4 是一个很好的选择。而如果数据主要是英文,latin1 或 ASCII 可能就足够了。使用合适的字符集可以帮助优化存储效率和查询性能。

排序规则

在 MySQL 中,创建数据库时可以指定排序规则(Collation),排序规则决定了数据库中字符比较和排序的行为。MySQL 提供多种排序规则,以支持不同的字符集和多种语言的特定需求。每个字符集都有默认的排序规则,但也可以指定其他兼容的排序规则。排序规则的命名通常遵循字符集_排序规则的格式。以下是一些常见的排序规则类型及其说明:

  • _ci:Case Insensitive,不区分大小写的排序规则。例如,utf8mb4_general_ci 表示对于 utf8mb4 字符集的比较和排序是不区分大小写的。
  • _cs:Case Sensitive,区分大小写的排序规则。例如,utf8mb4_bin 通常是区分大小写的,_bin 表示“二进制”,在这种排序规则下,比较是基于字符的二进制值,从而实现区分大小写以及特殊字符的精确比较。
  • _bin:Binary,即“二进制”排序规则,它基于字符的二进制值进行比较,这是最精确的比较方式,可以区分大小写和字符的不同变体。例如,latin1_bin
  • _general_ci_unicode_ci:这些排序规则为不同的字符集提供了优化的性能和比较的准确性。_general_ci 是一种比较通用的不区分大小写的比较方法,它的性能比_unicode_ci好,但可能在某些语言的字符比较上不够准确。_unicode_ci是基于Unicode标准的,提供了更为准确的语言特定字符比较,尤其是在处理多语言环境时。
  • _ai_as:Accent Insensitive (_ai) 和 Accent Sensitive (_as),这些排序规则决定了数据库如何处理字符的变音符号。例如,西班牙语中,“ń”和“n”在 Accent Sensitive 排序规则下被视为不同字符,而在 Accent Insensitive 排序规则下则被视为相同字符。

排序规则的选择取决于应用场景。例如,如果你的应用需要支持多种语言,并且对字符的比较需要尽可能准确,那么选择一个支持多语言的、基于 Unicode 的排序规则会是一个好的选择。如果应用主要处理英文数据,并且对性能要求较高,则选择一个简单的、不区分大小写的排序规则可能更合适。

MySQL 允许你为每个表甚至每个列指定排序规则,这提供了极大的灵活性来优化应用的性能和准确性。在设计数据库和应用时,合理选择字符集和排序规则对于确保数据的正确性、提高查询性能以及支持国际化非常关键。

是否加密

MySQL提供了透明数据加密(TDE)功能,这是一种服务器端的加密技术,可以实现对数据的透明加密和解密,对应用程序透明。透明数据加密主要用于加密数据库的物理文件,如数据文件和日志文件。使用 TDE 时,数据库管理员不需要修改应用程序代码来实现加密,MySQL 会自动处理加密和解密过程。

总的来说,是否启用数据库加密取决于对数据安全性和性能的需求。对于包含敏感信息的数据库,推荐启用加密以保护数据安全。对于对性能要求极高且不包含敏感信息的情况,可以考虑不启用加密以提高性能。在任何情况下,都应该根据实际情况和合规性要求来决定是否启用数据库加密。