MySQL数据系统与其它关系数据库一样,在需要使用该数据库之前,必须先创建数据库。
之前已经提出过一个概念,就是任何程序都是四种语句状态:新增、查找、修改、删除。创建数据库当然属于第一种“新增”的语句状态。
让我们先用 HELP ‘CREATE DATABASE’; 命令查看一下该语句的结构。
mysql> HELP ‘CREATE DATABASE’; #使用HELP帮助功能调阅命令信息
Name: ‘CREATE DATABASE’
Description:
Syntax: #蓝色文字为该语句的语法格式
CREATE DATABASE creates a database with the given name. To use this
statement, you need the CREATE privilege for the database. CREATE
SCHEMA is a synonym for CREATE DATABASE.
URL: https://dev.mysql.com/doc/refman/8.0/en/create-database.html
通过HELP命令,我们查看到数据库创建命令的语句和语法格式。
}
来吧,让我们花点时间先搞明白语句格式,和格式表达方式。
上面的格式中我们可以发现,语句格式分为上下2段。
其中:
是上半段的信息,可能一看感觉有点晕。不要着急,让我们慢慢来看。
CREATE(创建)
是语句主要关键字!已经定义了语句需要做什么?或者说,本条语句将完成什么功能?本文中,说明的是创建数据库。当然,在之后还有创建数据表、创建视图、创建存储过程、 创建函数、 创建触发器等等,都将用到该关键字。
{DATABASE | SCHEMA}
是指定需要创建的物品是什么。在这里我们需要创建的是数据库, DATABASE | SCHEMA (数据库/架构)是同义词。也就是说,无论用 DATABASE或者是 SCHEMA系统认为是一样的意思。所以 DATABASE | SCHEMA 之间的“ | ”管道符是二选一的意思(如果以后在语法格式中可能还会遇到2个 “ | ” 管道符 或者多个 管道符 ,记得是只能选择一个来使用的意思)。语句结构中的 {DATABASE | SCHEMA} 蓝色部分“ { | } ”大括号 是必须有,但是二选一(多选一)的意思。
小贴纸“选一规则”
在这里需要特别说明, “ | ” 管道符 的 二选一或多选一的规则,只适合在主句关键字中。
子句内的 “ | ” 管道符 规则是至少选一。
也就是说,子句中如何出现 “ | ” 管道符 后的多个选项,可以选一个,多个,或者全选。
小贴纸“符号说明”
不同的书籍、资料中对符号的称呼都有不同。
“ | ” 管道符 ,也有称为 管状符;
“ { } ”大括号 ,也有称为 花括号的;
“[ ] ” 中括号 ;
“( )”括号, 也有称为 小括号的。
英文意思是“如果不存在”。请注意,这里使用是 “[ ] ” 中括号,而不是之前的 “ { } ”大括号。意思是不同的!
“[ ] ” 中括号 表示子句或者非必要的辅助语句;
“ { } ”大括号 表示主句,也就是必须要出现的语句。
在这里 IF NOT EXISTS 是子句,可以出现,也可以不出现。
这个子句用做判断。
数据库名,建议使用英文字母、数字或者少量字符为名称。
只要原本数据库中没有重名,就可以使用。
注意!中文文字作为数据库名也是可以使用的,不过需要特别指定字符集才可以,不然会出现系统无法识别的乱码。
创建选项,可以看到该选项使用的是 “[ ] ” 中括号 。也就是 子句或者非必要的辅助语句 。不过,我们可能注意到,命令格式的第二段都是有关 [create_option] … 的格式内容。在这里我们先放一下,先不必理会。
好再来看一下第一段的格式:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_option] …
我们把必须出现的先整理出来。
CREATE DATABASE db_name 或者 CREATE SCHEMA db_name 就可以创建数据库。因为其它属于子句或者辅助功能的语句,可以不出现。
让我们来操作创建数据库吧。
GO!
mysql> SHOW DATABASES; #输入语句,查看现有数据库
4 rows in set (0.01 sec) #显示为4个已有数据库
mysql> CREATE DATABASE db_test1; # 输入语句, 创建名为 db_test1 的数据库
Query OK, 1 row affected (0.02 sec) #显示创建完成,并且显示用时
mysql> CREATE SCHEMA db_test2; # 输入语句, 创建名为 db_test2 的数据库
Query OK, 1 row affected (0.01 sec)
| db_test1 | #查看到数据库 db_test1 已经存在
| db_test2 | #查看到数据库 db_test2 已经存在
6 rows in set (0.00 sec) #显示为6个已有数据库
mysql> CREATE SCHEMA db_test2; # 输入语句,再次创建名为 db_test2 的数据库
ERROR 1007 (HY000): Can’t create database ‘db_test2’; database exists #系统报错!提示:不能创建 db_test2 数据库;数据库存在
6 rows in set (0.00 sec) #可以看到,显示还是为6个已有数据库,没有重复的数据库出现
以上操作,我们创建了2个数据库并且成功。当我们再次创建 db_test2 数据库时,系统告知数据库存在。查看所有的数据库,没有出现重复的数据库。
到这里,几乎所有数据资料都已经完成该语句的说明。不过我要告诉你,笔者可能有强迫症或者喜欢探究到底。本文之后的内容,可能您未必看到或者知晓了。
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_option] …
让我们继续来看数据库创建语句中的上半部分。
[IF NOT EXISTS] 属于子句,所以在建立数据库时,可以在语句中出现。但出现会如何呢?
mysql> CREATE DATABASE IF NOT EXISTS db_test3; #输入使用 IF NOT EXISTS 子句的语句,并且创建数据库
Query OK, 1 row affected (0.04 sec) #系统显示完成,并且影响了1条信息
mysql> CREATE DATABASE db_test3; #输入不带 IF NOT EXISTS 子句的语句,并且创建数据库。这里请注意,我们创建的是已有数据库重名的数据库。
ERROR 1007 (HY000): Can’t create database ‘db_test3’; database exists #当然系统执行语句后,会报错。这个结果和我们之前创建重复的db_test2数据库一样。
mysql> CREATE DATABASE IF NOT EXISTS db_test3; #输入使用 IF NOT EXISTS 子句的语句,并且创建数据库。请注意,我们建立的是一个重复已有的数据库。理论上将与之前一样,系统会报错。
Query OK, 1 row affected, 1 warning (0.00 sec) #系统执行完成后,显示OK!而且也被影响到了。这个未免有点奇怪,请不重要着急,继续看后面的信息。 1 warning 这里有个警告。
mysql> SHOW WARNINGS; #输入 SHOW WARNINGS 语句可以查看警告内容。
+——-+——+—————————————————+
| Level | Code | Message |
+——-+——+—————————————————+
| Note | 1007 | Can’t create database ‘db_test3’; database exists | #系统输出的警告具体内容。
+——-+——+—————————————————+
mysql> SHOW DATABASES; # 输入语句, 再次查看现有数据库
7 rows in set (0.00 sec) #可以看到,显示还是为7个已有数据库,没有重复的数据库出现
以上我们对 IF NOT EXISTS 子句,做了具体操作演示。
作为一个子句,我们反复强调它是一个子句。从以上实例中可以看出,在没有子句的情况下,主句还是可以正常运行的。在加入子句后,运行的结果会有所不同,但是功能基本不变。
小贴纸 “出错查询”
SHOW WARNINGS 语句可以查看当前系统报错的具体内容。属于SHOW语句中的一部分,之前学习到也在经常使用的SHOW DATABASES也属于其中。
mysql> SHOW CREATE DATABASE db_test3; #输入语句,查看数据库创建语句。
+———-+————————————————————————————————————————————+
+———-+————————————————————————————————————————————+
| db_test3 | CREATE DATABASE db_test3 /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION=’N’ */ |
+———-+————————————————————————————————————————————+
1 row in set (0.03 sec)
小贴纸 “查看数据库建立语句”
SHOW CREATE DATABASE db_name 语句可以查看指定数据库的创建语句。
以上显示的信息中可能只有 CREATE DATABASE db_test3 您是属性的。因为我们已经学习过了。之后的大段到底是什么?让我们再去看一下完整的数据库建立语法格式。
Syntax:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] …
create_option: [DEFAULT] {
}
是不是感觉有点明白了?没有错!语法格式的下半段,正好是我们现在还看不懂的信息。
请注意!上半段中的 [create_option] … 到现在我们还没说。不过现在看来,就比较好理解了! [create_option] … 是子句,所有的内容语法格式都再下半段说明。感叹程序设计者的用心,就连帮助文件的排版都这样有规则。让我们来学习一下吧。
[create_option] … 创建选项….有很多。
create_option: 它包括:
[DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
| ENCRYPTION [=] {‘Y’ | ‘N’}
DEFAULT 该选项是默认的。 如果不输入信息,系统将自定设定默认值,就好像之前 db_test3 数据库一样。
CHARACTER SET [=] charset_name 字符集 设置,需要指定 字符集 名称。
COLLATE [=] collation_name 排序规则 设置,需要指定 排序规则 名称。
ENCRYPTION [=] {‘Y’ | ‘N’ } 加密 设置,需要指定加密选项。只有Y和N(是或不是),默认为N。
以上三个选项中, 加密 设置 是很好理解的。但是 字符集 和 排序规则 是个什么东东?
小贴纸 “字符集 和 排序规则 ”
有关这个问题,笔者真的翻阅过大量资料,最后看到吐。
我最后的理解是,计算机上需要处理很多文字(汉语、英语、日语、德语、西班牙语……)等等语言。需要处理这样多不同国家的文字需要有标准。 字符集 就是标准, 字符集 名称 就是语言的名字。比如汉语,就是字符集的名字。
排序规则 可以理解为方言。虽然说的都是中文,辽宁方言,是无法与广东方言交流的。何况还有方言大省福建(据说在福建,过一个山口,当地人就听不懂山对面人的话了)。
排序规则 有些书籍 资料上也有称为 校验方式 校验规则等等的。
mysql> CREATE DATABASE db_test4 CHARACTER SET ‘utf8’ COLLATE ‘utf8_unicode_520_ci’; #输入数据库创建语句,设定字符集和排序规则。
Query OK, 1 row affected, 2 warnings (0.08 sec) #请注意,这里系统有2个报警。
mysql> SHOW CREATE DATABASE db_test4;
| db_test4 | CREATE DATABASE db_test4 /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_520_ci */ /*!80016 DEFAULT ENCRYPTION=’N’ */ |
mysql> SHOW WARNINGS; #输入查看报警信息语句
Empty set (0.00 sec) #没有任何信息
以上是设定了字符集和排序规则的语句操作。不过在这里系统有警告,但是查询警告缺没信息,这点让我很困惑。希望有知道的大侠能指点一下!
有关 ENCRYPTION [=] {‘Y’ | ‘N’ } 加密 设置
我查阅了MySQL的官方资料,是这样说明的(翻译水平有限请谅解!):
The ENCRYPTION option, introduced in MySQL 8.0.16, defines the default database encryption, which is inherited by tables created in the database. The permitted values are ‘Y’ (encryption enabled) and ‘N’ (encryption disabled).
在 MySQL 8.0.16 中引入的 ENCRYPTION 选项定义了默认的数据库加密,该加密由在数据库中创建的表继承。 允许的值为“Y”(启用加密)和“N”(禁用加密)。
再之后的资料中还提到了,需要系统变量,权限等设定的。感觉有点复杂了!在实际工作中,笔者还没有遇到过数据库加密这个选项,这也是8.0.16版本开始出现的新功能,笔者也没有学习和使用过。本文不再展开,如果之后遇到也学习使用过后,再和大家一起分享。
mysql> CREATE DATABASE db_test5 CHARACTER SET ‘utf8’; #输入数据库创建语句,只设定字符集。
mysql> CREATE DATABASE db_test6 COLLATE ‘utf8_unicode_520_ci’; #输入数据库创建语句,只设定排序规则。
Query OK, 1 row affected, 1 warning (0.10 sec)
mysql> SHOW DATABASES; #输入数据库查看语句。
| db_test6 | #确定新建数据库已经完成。
10 rows in set (0.08 sec)
让我们来看一下,只输入字符集或者排序规则,会是什么样子的数据库?
mysql> SHOW CREATE DATABASE db_test5;
+———-+——————————————————————————————————+
+———-+——————————————————————————————————+
| db_test5 | CREATE DATABASE db_test5 /*!40100 DEFAULT CHARACTER SET utf8 */ /*!80016 DEFAULT ENCRYPTION=’N’ */ | #可以看到设置的字符集,但是没有显示排序规则。
+———-+——————————————————————————————————+
mysql> SHOW CREATE DATABASE db_test6;
| db_test6 | CREATE DATABASE db_test6 /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_520_ci */ /*!80016 DEFAULT ENCRYPTION=’N’ */ |
+———-+———————————————————————————————————————————-+ #可以看到既有字符集,又有排序规则。
1 row in set (0.00 sec)
从 上面的操作实例中,我们可以看出。字符集和排序规则都可以单独输入,而且不会影响语句的执行。但也不难发现其中的区别。在只输入 字符集 没有指定 排序规则 的语句建立的数据库 db_test5 中,没有 排序规则 信息。在只输入 排序规则 没有指定 字符集 的语句建立的数据库 db_test6 中, 字符集 排序规则 信息都有这个是为什么?
这是因为, 字符集 和 排序规则是有隶属关系的。 排序规则 一定属于一个特定 字符集 ,这样系统可以自己查找到并且自动添加。反之, 字符集 下会有很多 排序规则 ,如果用户指定,系统不知道为您指定那个具体的 排序规则 ,所以无法添加。
mysql> CREATE DATABASE db_test7 COLLATE ‘utf8_unicode_520_ci’ENCRYPTION=’Y’; #设定加密
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> SHOW CREATE DATABASE db_test7;
+———-+———————————————————————————————————————————-+
+———-+———————————————————————————————————————————-+
| db_test7 | CREATE DATABASE db_test7 /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_520_ci */ /*!80016 DEFAULT ENCRYPTION=’Y’ */ | #显示加密为是
+———-+———————————————————————————————————————————-+
1 row in set (0.00 sec)
使用加密选项的实例操作。目前我还不知道设置后会如何,真的希望能有大侠指教。
mysql> CREATE DATABASE 测试用中文数据库; #输入中文名称的数据库创建测试
Query OK, 1 row affected (0.06 sec)
mysql> SHOW DATABASES;
+——————–+
| Database |
+——————–+
| db_test1 |
| db_test2 |
| db_test3 |
| db_test4 |
| db_test5 |
| db_test6 |
| db_test7 |
| information_schema |
| mysql |
| performance_schema |
| sys |
| 测试用中文数据库 |
+——————–+
12 rows in set (0.00 sec)
mysql> SHOW CREATE DATABASE 测试用中文数据库;
+——————+——————————————————————————————————————————————–+
| Database | Create Database |
+——————+——————————————————————————————————————————————–+
| 测试用中文数据库 | CREATE DATABASE 测试用中文数据库 /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION=’N’ */ |
+——————+——————————————————————————————————————————————–+
1 row in set (0.00 sec)
从以上实例操作中,我们可以看到,使用汉字字符作为数据库名称是可以被MySQL接受并且正常显示的。




