购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第1章
初识MySQL

本章内容:

· MySQL的介绍

· 在Windows上安装MySQL

· 在Linux上安装MySQL

· 在Docker上安装MySQL

本章将讲解MySQL在Web业务场景下的意义和优势,介绍MySQL 8的特性和作用,并讲述在多种环境下安装MySQL的步骤,以便初学者可以快速开始MySQL的学习。

1.1 MySQL是什么

MySQL是当下流行的关系数据库管理系统(Relational Database Management System,RDBMS),使用C和C++语言编写而成,因而具有源码级的可移植性。MySQL可以在Linux、macOS、Novell NetWare、OpenBSD、Solaris、Windows等多种操作系统中运行。在Web应用方面,MySQL是非常好的关系数据库管理系统应用软件之一。作为一种关系数据库管理系统,它将数据保存在不同的数据表中。MySQL所使用的SQL语言是用于访问数据库的常用标准化语言。由于MySQL体积小、速度快、总拥有成本低,尤其是具有开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其社区版性能卓越,因此搭配各种后端语言可以组成良好的开发环境。此外,MySQL既可以嵌入应用程序中,也可以独立支持数据仓库、全文索引和高可用的冗余系统、在线事务处理系统。另外,MySQL还具有如下特点:

· 为多种编程语言提供了API,这些编程语言包括C、C++、Python、Java、Perl、PHP、Ruby、.NET等。

· 支持多线程,可以充分利用CPU资源。

· 具有优化的SQL查询算法,有效地提高了查询速度。

· 提供TCP/IP、ODBC和JDBC等多种数据库连接途径。

· 支持可以处理上千万条记录的大型数据库。

· 支持多种存储引擎,比如InnoDB、MyISAM等。

· MySQL是可以定制的,它采用了GPL协议,因而用户可以通过修改源码来开发自己的MySQL系统。

· 提供多语言支持,常见的编码如中文的GB2312、UTF-8等都可以用作数据表名和数据列名。

· 提供用于管理、检查、优化数据库操作的管理工具。

· 具有在线DDL更改功能,数据架构支持动态应用程序,提高了开发人员操作数据表的灵活性。

· 复制无崩溃从机,可以提高可用性。

· 复制多线程从机,可以提高性能。

1.2 MySQL 8安装和配置

1.2.1 安装版本的选择

在安装MySQL时,应选择自己所需的版本和相应的文件格式。MySQL有开发版本和通用版本。开发版本具有最新功能,但不建议用于生产用途。通用版本可用于生产用途,因此建议安装最新的版本。

MySQL 8.0的版本号由三个数字和一个可选后缀组成,例如MySQL-8.0.3.[x],x可选,如果有,则会随着版本的发布而自增。版本号中的数字解释如下:

· 第一个数字(8)是主版本号。

· 第二个数字(0)是次版本号。主、次版本号一起构成发布的序列号,序列号表示包含稳定的功能集。

· 第三个数字(3)是发布系列中的版本号。每个新的错误修订版的版本号中都会增加此值。一般情况下建议安装最新的版本。

1.2.2 在Windows平台下安装和配置MySQL

MySQL只能安装在Microsoft Windows 64位操作系统中,如果想要安装MySQL 8.0 Server(服务器版),那么还需要在系统中安装Microsoft Visual C++ 2015 Redistributable Package和Microsoft .NET Framework 4.5.2或更高版本。在安装服务器版本之前,应确保在本地系统中已下载好软件安装包。下面将演示在Windows系统中安装MySQL数据库的两种方式。

1.MySQL Installer(利用安装程序安装)

进入MySQL官网下载相关安装包,如图1-1所示。第一个安装包用于在线安装,在网络畅通的情况下,可以选用这种安装方式。第二个是可以离线安装的软件包,一般建议采用这种安装方式。

图1-1 下载安装包

首次下载MySQL安装程序时,安装向导会引导我们完成MySQL产品的初始安装。首次安装需要进行初始设置,MySQL安装程序在初始设置期间会检测主机上安装的现有MySQL产品,并将它们添加到要管理的产品列表中。如图1-2所示,当我们打开MSI文件之后,会提示我们选择安装的类型。

图1-2 选择安装的类型

如图1-2所示,总共有5种安装类型。

①Developer Default(默认安装):用于MySQL应用程序的开发。如果我们想要利用MySQL来进行应用程序的开发,可以选择此安装类型。

②Server only(仅安装服务器):仅安装MySQL服务器。此安装类型在下载MySQL服务器安装包时会让用户选择安装GA版(一般可用性,即稳定版)或开发版。该安装类型使用默认的安装路径和数据存储路径。

③Client only(仅安装客户端):仅安装最新的MySQL应用程序和MySQL连接器。此安装类型类似于默认安装类型,不同之处在于它不包括MySQL服务器或通常与服务器捆绑的客户端程序,例如mysql或mysqladmin。

④Full(完整):安装所有可用的MySQL产品。如果是初学者,那么可以选择此安装类型。

⑤Custom(自定义):此安装类型可以从MySQL安装程序目录中筛选想安装的各个MySQL产品。

选择好想要的安装类型,单击Next按钮,就会进入安装需求检查对话框,如图1-3所示。

图1-3 安装需求检查对话框

在安装需求检查对话框中包括如下内容:

①显示初始设置中的当前步骤。读者在此列表中看到的步骤可能会略有不同,具体步骤取决于主机上已安装的产品、必备软件的可用性以及读者想要安装在主机上的产品。

②按产品列出所有待确认的安装需求。

③安装需求的详细说明可以帮助我们解决安装前需要解决的问题。如果需要安装必备的软件,则该界面会提供下载用的网址(URL)。在下载并安装所需的软件后,单击Check按钮来验证是否已经满足安装需求。

④提供以下辅助安装的操作:

· Back:返回上一步。此操作可以让我们回到上一步重新选择安装类型。

· Execute:让MySQL安装程序尝试为所有选择的安装项目下载和安装必备的软件。

· Next:不进行安装需求检查而继续安装产品,其中不包括未通过安装需求检查的产品。

· Cancel:取消安装MySQL产品。

MySQL网络和身份认证配置,如图1-4所示。

图1-4 MySQL网络配置

在该对话框中有以下选项:

①选择需要配置的服务类型。

②默认的服务端口号,①和②这两个配置可以不做修改。

③建议勾选Show Advanced and Logging Options复选框,以便在后续步骤中设置自定义日志记录和高级选项。

继续往下执行,会出现设置密码的对话框,如图1-5所示。

图1-5 账户密码设置

该对话框包含以下内容:

①给服务设置密码。

②重复输入一次以确认密码,应当确保这两次输入的密码一致。

MySQL服务名称设置,如图1-6所示。

图1-6 MySQL服务名称设置

在该对话框中输入MySQL服务的名称,建议使用默认值。

设置MySQL服务相关的输出日志存储的路径,如图1-7所示。

图1-7 设置MySQL服务输出日志存储的路径

在该对话框中包含以下内容:

①设置MySQL服务的错误日志输出路径。

②设置一般的日志输出路径。

③设置查询日志的输出路径。

④设置二进制日志的输出路径。

验证是否安装成功。如图1-8所示,按住键盘上的Windows键,选择“运行”,然后在弹出的对话框中输入services.msc,并按回车键。

图1-8 进入“运行”对话框

接下来会出现如图1-9所示的服务窗口。如果可以看到MySQL 8.0这个服务,就表示MySQL数据库安装成功。

图1-9 系统服务窗口

在服务成功启动之后,可以使用界面化工具Navicat连接数据库,当出现如图1-10所示的对话框时,输入主机名、端口号以及安装时设置的密码。在单击“测试连接”按钮之后,若出现连接成功的字样,则说明安装与配置都正确。

图1-10 通过界面化工具测试连接

2.在Windows上默认安装MySQL服务

表1-1所示是以默认安装类型安装MySQL服务后生成的相关目录,当我们需要查看相关信息或者数据日志时可能会用到。

表1-1 默认安装MySQL服务之后生成的相关目录

1.2.3 在Linux平台下安装和配置MySQL

使用MySQL Yum存储库安装最新的MySQL GA版本的步骤如下。

1.添加MySQL Yum存储库

要将MySQL Yum存储库添加到系统的存储库列表中,可以使用RPM命令来完成,具体步骤如下:

首先选择并下载适用于目标平台的安装包(发布包)。

我们可以查看目标系统的平台版本(操作系统版本序列号)。如图1-11所示,该平台的版本序列号为7。

图1-11 查看目标系统的操作系统版本序列号

然后下载工具wget,下载完成之后用下面的命令进行安装:

    yum install wget -y

接着下载对应版本的RPM文件,因为目前的平台是7系列,所以选择安装7.3版本的RPM文件。执行如下命令进行下载:

    wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

当出现如图1-12所示的界面时,说明下载成功。

图1-12 下载RPM包

2.安装下载的发布包

安装命令如下:

    yum install platform-and-version-specific-package-name.rpm

需要注意的是,platform-and-version-specific-package-name为下载的RPM包的名称。而后执行如下命令:

    yum install mysql80-community-release-el7-3.noarch.rpm -y

如果出现如图1-13所示的Complete说明,就表示发布包安装完成。

图1-13 发布包安装成功

如果使用的是其他系列的版本,那么可以根据实际情况选择安装相应的发布包。

对于基于EL6的系统,命令的形式为:

    yum install mysql80-community-release-el6-{version-number}.noarch.rpm

对于基于EL7的系统,命令的形式为:

    yum install mysql80-community-release-el7-{version-number}.noarch.rpm

对于基于EL8的系统,命令的形式为:

    yum install mysql80-community-release-el8-{version-number}.noarch.rpm

对于Fedora 34,命令的形式为:

    dnf install mysql80-community-release-fc34-{version-number}.noarch.rpm

对于Fedora 33,命令的形式为:

    dnf install mysql80-community-release-fc33-{version-number}.noarch.rpm
3.安装MySQL

通过以下命令安装MySQL:

    yum install mysql-community-server -y

这条命令将安装MySQL服务器包(mysql-community-server)以及运行该服务器所需组件的包,包括客户端包(mysql-community-client)、客户端和服务器的常见错误消息和字符集(mysql-community-common)以及共享客户端库(mysql-community-libs)。如果出现如图1-14所示的信息,就表示安装成功。

图1-14 安装MySQL

4.启动MySQL服务器

使用以下命令启动MySQL服务器:

    systemctl start mysqld

使用以下命令检查MySQL服务器的状态:

    systemctl status mysqld

查询服务的状态,显示running时表示服务已经启动,如图1-15所示。

图1-15 MySQL服务状态

需要注意的是,如果操作系统已启用systemd,则应使用标准systemctl(或service)命令(例如stop、start、status和restart)来管理MySQL服务器的服务。mysqld服务默认是启用的(在系统重新启动时启用了)。

5.登录MySQL

在安装MySQL服务时系统创建了一个超级用户账户(root)。超级用户的密码已设置并存储在错误日志文件中,如果我们想要知道密码,可以使用如下命令进行查询:

    grep 'temporary password' /var/log/mysqld.log

如图1-16所示,最后输出的字符串就是想要查看的密码。

图1-16 想要查看的密码

我们使用生成的临时密码登录并为超级用户账户设置自定义密码,以便尽快更改root密码。首先执行下面的命令进行登录:

    mysql -uroot -p

如图1-17所示,在登录过程中需要输入密码,可以输入之前查询到的密码进行登录。

图1-17 MySQL登录

然后执行如下命令修改密码:

    alter user 'root'@'localhost' identified by 'NewPass';

在修改密码时注意密码要尽量复杂,需要包含数字、大小写字母和标记符号,否则系统会出现如图1-18所示的提示,提示密码修改出错。

图1-18 修改MySQL账户的密码

1.2.4 在Docker平台下安装和配置MySQL

Docker是一个用于开发、交付和运行应用程序的开放平台。Docker能够将应用程序与基础架构分开,从而快速交付软件。借助Docker,可以采用与管理应用程序相同的方式来管理基础架构。

Docker是当下热门的容器,为了省去Linux下安装配置程序烦琐且易于出错的步骤,笔者增加了本节内容,安装Docker环境后,就能在其下快速地安装Redis服务。

1.在CentOS下安装Docker

安装Docker的系统需求是必须具备一个CentOS 7或者CentOS 8的维护版本,不支持之前的旧版本。

1)卸载旧版本

较旧的Docker版本称为docker或docker-engine。如果安装过这些程序,请卸载它们及其相关的依赖项。

2)更新系统yum工具包

需要安装yum-utils软件包:

    $ sudo yum install -y yum-utils
3)设置稳定的存储库(可选择其中一个)

可以根据自己的网络情况选择存储库地址,推荐使用阿里云和清华大学源,如果设置官方源,那么需要单独设置好网络才可以进行正常操作。

使用官方源地址:

    $ sudo yum-config-manager \
        --add-repo \
    https:// download.docker.com/linux/centos/docker-ce.repo

使用阿里云:

    $ sudo yum-config-manager \
       --add-repo \
    http:// mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

使用清华大学源:

    $ sudo yum-config-manager \
        --add-repo \
    https:// mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
4)安装Docker Engine-Community

安装社区版Docker包:

    $ sudo yum install docker-ce docker-ce-cli containerd.io
5)启动Docker

启动Docker很简单:

    $ sudo systemctl start docker
6)验证是否正确安装

可以使用如下命令来验证Docker是否正确安装:

    $ sudo docker run hello-world
2.在Windows 10下安装Docker

Docker Desktop是Docker在Windows 10和macOS操作系统上的官方安装方式,这种方式依然是先在虚拟机中安装Linux,再安装Docker。用户可以从网上搜索Docker Desktop的安装软件docker-ce-desktop-windows(此方法仅适用于Windows 10操作系统专业版、企业版、教育版和部分家庭版)。

1)安装Hyper-V虚拟机

Hyper-V是微软开发的虚拟机,类似于VMWare或VirtualBox,只是Hyper-V仅适用于Windows 10。这是Docker Desktop for Windows所使用的虚拟机(这个虚拟机一旦启用,VirtualBox、VMWare、Workstation 15及以下版本将无法使用。如果必须在计算机上使用其他虚拟机,则不要在Windows中启动Hyper-V)。

2)启动Hyper-V

启动Hyper-V的操作步骤如下:

在Windows中右击“开始”按钮,在弹出的快捷菜单中选择“应用和功能”命令,如图1-19所示。

打开“程序和功能”窗口,单击“启用或关闭Windows功能”链接,如图1-20所示。

图1-19 选择“应用和功能”命令

图1-20 “程序和功能”窗口

在打开的“Windows功能”对话框中勾选“Hyper-V”复选框,然后单击“确定”按钮,如图1-21所示。

图1-21 勾选“Hyper-V”复选框

3)安装Docker

接下来双击下载的安装Docker的EXE文件,在打开的对话框中单击Next按钮,最后单击Finish按钮完成安装。

安装完成后,Docker会自动启动,通知栏上会出现 图标,表示Docker正在运行,然后按Win+R快捷键,在弹出的“运行”窗口中输入PowerShell。

用户还可以执行命令docker run hello-world来检查是否安装成功。

3.利用Docker安装MySQL
1)下载MySQL镜像

执行docker pull mysql/mysql-server:8.0下载MySQL镜像,如图1-22所示。

图1-22 下载镜像

2)启动MySQL服务

执行如下命令启动MySQL服务:

    docker run --name=mysql1 --restart on-failure -d mysql/mysql-server:8.0
3)其他操作

删除容器的命令如下:

    docker rm -f mysql1

停止容器的命令如下:

    docker stop mysql1
4)查看启动的日志

查看启动日志的命令如下:

    docker logs mysql1

查看MySQL服务的密码的命令如下:

    docker logs mysql1 2>&1 | grep GENERATED

查询到的密码如图1-23所示。

图1-23 查询到的密码

5)登录MySQL服务

登录MySQL服务的命令如下:

    docker exec -it mysql1 mysql -uroot -p

当系统询问时,输入生成的root密码。由于该MYSQL_ONETIME_PASSWORD选项默认为true,因此在将MySQL客户端连接到服务器后,必须通过以下语句来重置服务器root账户的密码:

    alter user 'root'@'localhost' identified by 'password';

或者执行下面的命令进行安装:

    docker run -p 3306:3306 --name mysql \
    -v /root/mysql/log:/var/log/mysql \
    -v /root/mysql/data:/var/lib/mysql \
    -v /root/mysql/conf:/etc/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d mysql/mysql-server:8.0

以上命令挂载了服务的日志文件和lib文件,已经设置好了密码。需要注意的是,在执行这条命令之前,要在宿主机的/root/mysql/conf目录下创建my.cnf文件,这个文件是服务启动的配置文件,该配置文件至少应该有如下几行内容:

    [mysqld]
    init_connect='set collation_connection = utf8_general_ci'
    init_connect='set names utf8'
    secure_file_priv=

1.3 如何学习MySQL

在学习MySQL数据库之前,很多读者会问,如何才能更好地学习MySQL的相关技能呢?下面就讲述学习MySQL的方法。

1.培养兴趣

兴趣是最好的老师,不论学习什么知识,兴趣都可以极大地提高学习效率,学习MySQL也不例外。

2.扎实基础

随着技术应用的不断深入,只有有着扎实的基础功底,才能在技术道路上走得更远。对于MySQL的学习而言,SQL语句是其中最基础的部分,很多功能都通过SQL语句来实现,所以读者在学习的过程中要多编写SQL语句,最好能对同一功能使用不同的SQL语句来实现。

1.4 本章练习

1.下载并安装MySQL数据库。

2.使用配置向导配置MySQL为系统服务,并设置为手动启动或者关闭MySQL服务。 nlPBe57PBJl6vCfn9gwZDQvBvgPgURxrmGXGd+ob4v66+4mPgz307oZ1byCGv++F



第2章
数据库设计

本章内容:

· 数据库设计理论

· 连接数据库

· 创建数据库和表

本章将讲解数据库设计理论,以简单的示例讲解三大范式以及MySQL中对数据库和表的基本操作(包括创建数据库、切换数据库、创建表等)。

2.1 关系数据库设计理论三大范式

关系模型(Relational Model)是一种基于表的数据模型,它广泛应用于数据库管理系统(DBMS)中。关系模型的核心思想是将数据组织成表,每个表包含一组相关的行和列。这些行和列之间的关系通过主键和外键来定义,从而实现数据的完整性、一致性和可维护性。关系模型中一些重要术语介绍如下:

· 属性(Attribute):列的名称。

· 关系(Relation):列属性之间存在的某种关联。

· 表(Table):由多个属性以及众多元组所表示的各个实例组成。

· 键(Key):由一个或多个属性组成,其值能唯一标识关系中的一个元组。如果某个关系A中的一个(组)属性是另一个关系B的键,则该(组)属性在A中被称为外键。

· 笛卡儿积(交叉连接,Cross Join):第一个关系的每一行数据分别与第二个关系的每一行数据组合。

· 自然连接(Natural Join):第一个关系的每一行数据与第二个关系的每一行数据进行匹配,若得到交叉部分则合并,若无交叉部分则舍弃。

· θ连接(Theta Join):加上约束条件的笛卡儿积,先得到笛卡儿积,再根据约束条件删除不满足条件的元组。

· 外连接(Outer Join):执行自然连接后,将舍弃的部分也加入,并且把匹配失败处的属性设置为null。

表2-1是一张酒店客人入住信息表。

表2-1 酒店客人入住信息表

通过表2-1可以发现,该表存在不符合规范的设计,总共有如下几点:

(1)信息重复:比如客房类型和客房状态存在大量的数据重复。

(2)更新异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被同步修改。

(3)插入异常:无法正确表示信息。

(4)删除异常:丢失有效信息。

下面利用三大范式对数据库进行改造。

第一范式(1NF): 目标是确保每列的原子性,如果每列都是不可再分的最小数据单元(也被称为最小的原子单元),则满足第一范式。

例2.1 第一范式优化表格示例。

没有经过第一范式优化的表格如表2-2所示。

表2-2 没有经过第一范式优化的表格

经过第一范式优化的表格如表2-3所示。

表2-3 经过第一范式优化的表格

第二范式(2NF): 要求每张表只描述一件事情。

例2.2 第二范式优化表格示例。

没有经过第二范式优化的表格如表2-4所示。

表2-4 没有经过第二范式优化的表格

经过第二范式优化之后,把一张表拆解成两张表,分别为Guest表和Room表。

Guest表如表2-5所示。

表2-5 Guest表

Room表如表2-6所示。

表2-6 Room表

第三范式(3NF): 如果一个关系满足第二范式,并且除了主键以外的其他列都不依赖于主键列,则满足第三范式。

例2.3 第三范式优化表格示例。

没有经过第三范式优化的Room表如表2-7所示。

表2-7 没有经过第三范式优化的Room表

经过第三范式优化之后,拆成3张表,分别是Room表、RoomType表和RoomState表。

Room表如表2-8所示。

表2-8 Room表

RoomType表如表2-9所示。

表2-9 RoomType表

RoomState表如表2-10所示。

表2-10 RoomState表

如上所述,经过三大范式将一张存在问题的大表拆分成4张表,最终数据库设计结构如图2-1所示(PK表示主键,FK表示外键)。

图2-1 酒店管理系统数据库模型

2.2 连接数据库和基本信息查询

数据库设计好了,本节就来连接数据库并进行基本信息查询。

2.2.1 连接数据库

要连接到SQL服务器,需要在调用MySQL时提供用户名,并且很可能需要提供密码。如果SQL服务器在其他计算机上运行,还必须指定主机名。此时应联系管理员,了解该使用哪些连接参数来进行连接(即使用的主机、用户名和密码)。当知道正确的参数之后,可以执行如下命令进行连接:

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

host和user分别代表运行的MySQL服务器的主机名和MySQL账户的用户名。********代表密码,当MySQL显示“Enter password:”提示时,输入账户对应的密码。如果输入密码正确,那么会看到如下信息:

    shell> mysql -h host -u user -p
    Enter password: ********
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 25338 to server version: 8.0.25-standard
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql>

出现“mysql>”提示符就表示可以输入SQL语句了。

如果在运行MySQL的同一台计算机上登录,则可以省略主机名,只需执行以下命令:

    shell> mysql -u user -p

如果在尝试登录时收到错误提示信息,例如ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2),则表示MySQL服务器守护程序(在UNIX操作系统中)或服务(在Windows操作系统中)未运行,也就是需要启动MySQL服务。

2.2.2 基本信息查询

本小节将介绍信息查询的基本原则,通过几个查询示例来熟悉MySQL的工作原理。

例2.4 查询服务器的版本号和当前日期。在“mysql>”提示符后面输入如下命令,然后按Enter键:

这是一个简单的查询,说明了有关MySQL查询的几点信息:

(1)查询通常由以分号结尾的SQL语句组成(有一些例外可以省略分号,QUIT语句就是其中之一)。

(2)当我们输入查询语句后,MySQL将它发送到服务器执行并显示结果,然后显示出下一个“mysql>”提示符,表明它已准备好接收另一个查询。

(3)MySQL以表格形式(行和列)显示查询的结果。第一行是列的标签(或称为列名),其他行是查询的结果。通常列标签是从数据库表中提取的列名称。如果要检索表达式的值而不是表列的值,那么MySQL会使用表达式本身来标记该列。

图2-2 SQL关键字不区分字母大小写示例

(4)MySQL显示返回了多少行数据以及执行查询用了多长时间,由此我们大致可以了解服务器的性能。不过这些值是不精确的,因为它们代表的是时钟时间,并且受到服务器负载和网络延迟等因素的影响。

例2.5 使用不同字母大小写进行相同内容的查询。

    mysql> SELECT VERSION(), CURRENT_DATE;
    mysql> select version(), current_date;
    mysql> SeLeCt vErSiOn(), current_DATE;

查询结果如图2-2所示,在查询时,输入的SQL语句中的关键字可以不区分字母大小写,最后输出的答案是一致的,也不会抛出任何异常。

例2.6 把MySQL用作计算器。

执行结果如图2-3所示,MySQL给出了计算结果。

例2.7 用分号分隔多条SQL语句。

执行结果如图2-4所示,可以在一行中输入多条SQL语句(或命令),每条SQL语句之间只需用分号分隔即可。

图2-3 MySQL作为计算器

图2-4 一行执行多条SQL语句

例2.8 MySQL可以写成多行的形式,最后带上终止分号即可。

上述SQL语句的执行结果如图2-5所示。如果一条SQL查询语句冗长,在一行内写不下,那么可以写成多行的形式,最后带上终止分号即可,因为MySQL不是在每一行的末尾去找代表SQL语句结束的分号,而是在多个连续行去找分号来确定语句的结束位置。(MySQL接收自由格式的输入,在看到分号之后才会执行当前的SQL查询语句),当我们不输入分号时,之前输入的命令是不会被执行的。

例2.9 取消查询。

    mysql>  select
        -> users
        -> \c
    mysql>

执行结果如图2-6所示,当输入“\c”之后,当前输入的命令就被取消执行了。

图2-5 多行查询

图2-6 取消执行当前输入的SQL命令

需要注意的是,在输入取消命令“\c”之后,MySQL回到“mysql>”提示符状态,表示已准备好接收新的查询。表2-11总结了MySQL显示不同提示符时所处的状态。

表2-11 MySQL所处状态的含义

(1)当以单行输入查询语句时,如果忘记以分号结尾,那么MySQL会一直等待我们输入“;”:

    mysql> select user()
       ->

如果发生这种情况(我们认为已经输入完成一条查询语句,而唯一的响应是“->”提示符),那么很可能就是MySQL在等待分号。输入分号之后,MySQL才会开始执行输入的SQL查询语句:

(2)“'>”和“">”提示符表示当前正处于字符串的收集过程中(即表示MySQL正在等待用户输入表示字符串终止的配对符号)。在MySQL中,我们可以编写由一对“'”或一对“"”作为起止的字符串,而MySQL允许输入跨多行的字符串。当看到“'>”或“">”提示符时,表示输入了包含以“'”或“"”开头的字符串,但尚未输入终止字符串的配对引号。例如:

    mysql> select * from mytable where name = 'clay  and age <18;
       '>

如果输入此select语句,然后按Enter键并等待结果,则没有任何反应。此时我们需要注意“'>”提示符提供的线索。它其实是告诉我们:MySQL希望看到字符串的其余部分(语句中clay开始的字符串缺少了第二个单引号)。此时我们可以选择输入“\c”取消本次查询语句的执行:

    mysql> select * from mytable where name = clay and age < 18;
        '> '\c
    mysql>

提示符又变回“mysql>”,表明MySQL再次就绪,可以接收新的查询。

2.3 创建数据库和表

在学习如何创建数据库和表之前,可以使用如下步骤来查询当前服务器中存在的数据库:

使用show语句查询当前服务器上存在哪些数据库:

从以上信息可以了解到,当我们执行show databases语句后,服务器将查询当前存在的所有数据库。

mysql数据库存储了用户访问权限等信息。test数据库是系统提供的默认测试库,可以删除。上述语句显示的数据库列表可能和读者计算机上显示的数据库列表有所不同,因为不会显示当前用户没有访问权限的数据库。

如果mysql数据库存在,那么我们可以进入mysql数据库查询当前数据库中的表。比如,使用如下语句可以切换到mysql数据库:

使用如下语句可以查询当前数据库中的所有表:

执行结果如图2-7所示,首先切换到mysql数据库,然后查询出当前mysql数据库中的所有表。

图2-7 查询mysql数据库中的所有表

2.3.1 创建数据库

如果要创建一个新的数据库,那么可以执行如下语句:

    create database DEMO;

执行结果如图2-8所示,创建数据库成功。

图2-8 创建数据库

在UNIX操作系统中,数据库的名称是区分字母大小写的(这与SQL关键字不区分字母大小写不同),因此在进入数据库时,必须使用数据库的名称DEMO来指向正确的数据库,而不能使用Demo、demo。对于表名也是如此(注意,在Windows中此限制不适用)。如图2-9所示,切换数据库时,由于未正确使用大小写而导致切换数据库操作失败。

如图2-10所示,唯有数据库名称的大小写正确才能正常完成数据库的切换。

图2-9 数据库切换操作失败

图2-10 数据库切换操作成功

如果在创建数据库时出现诸如ERROR 1044 (42000): Access denied for user clay@'localhost'的错误,则说明用户没有创建数据库所需的权限。

2.3.2 创建表

如图2-11所示,进入DMEO数据库中,此时该数据库中并没有任何表。

图2-11 切换数据库并查询所有表

如果要在DEMO数据库中创建表,那么在创建之前需要了解如下信息:

· 表名:代表数据表的名称,如果我们想要存储用户信息,则可以取名为userinfo。

· 表字段名:表示表中有哪些属性,比如name、age、address等字段。

以下为创建MySQL数据表的通用语法:

    create table table_name (column_name column_type);

例2.10 在DEMO数据库中创建数据表userinfo,SQL语句如下:

    create table if not exists `userinfo`(
       `id` int unsigned auto_increment,
       `name` varchar(100) not null,
       `age` int not null,
       `date` date,
       primary key ( `id` ))engine=innodb default charset=utf8;

上述语句说明如下:

· 如果不希望字段的值为null,那么可以将字段的属性设置为not null,如果在操作数据库时将null输入到该字段,则会报错。

· auto_increment:把列定义为自增的属性,一般用于主键,数值会自动加1。

· primary key:用于把列定义为主键,可以使用多列来定义主键,列之间以逗号分隔。

· engine:设置存储引擎。

· charset:设置字符集的编码。

· varchar(100)与int:代表此字段使用的数据类型,后续章节会专门讲解每一种数据类型。

创建结果如图2-12所示。

图2-12 创建表

如果想查询此表的结构,可以执行如下语句:

    describe userinfo;

执行结果如图2-13所示,可以清晰地看到此表的结构及其说明。

图2-13 查询表的结构及其说明

此后若再次查询当前数据库中的表,则会显示已创建表的基本信息,如图2-14所示。

图2-14 查询数据库中表的基本信息

2.4 本章练习

1.查看当前系统中所有的数据库。

2.创建名为userinfo的数据库。

3.根据表2-5、表2-6、表2-8、表2-9、表2-10的信息,使用SQL语句在数据库中创建表。 nlPBe57PBJl6vCfn9gwZDQvBvgPgURxrmGXGd+ob4v66+4mPgz307oZ1byCGv++F



第3章
MySQL数据类型

本章内容:

· 数字数据类型

· 日期和时间数据类型

· 字符串数据类型

· JSON数据类型

本章将讲解MySQL提供的多种数据类型(包括MySQL新提供的数据类型)以及数据库对每种数据类型出现异常时的处理。

3.1 数字数据类型

在MySQL中,数字数据类型又分为如下4个类别:

· 整数类型:integer、int、smallint、tinyint、mediumint、bigint。

· 定点类型:decimal、numeric。

· 浮点类型:float、double。

· 位值类型:bit。

1.整数类型

MySQL支持SQL标准整数类型int和smallint,也支持标准扩展的整数类型tinyint、mediumint和bigint。表3-1显示了每种整数类型所需的存储空间和取值范围,我们可以根据实际情况选用合适的整数类型。

表3-1 整数类型所需的存储空间和取值范围

2.定点类型

decimal和numeric类型用于保存对精度要求很高的数据,比如货币数据。在MySQL中,numeric被实现为decimal,所以适用于decimal数据类型的数据同样适用于numeric数据类型的数据。

在decimal列声明中,可以指定精度和小数位数。

例3.1 在decimal列声明中指定精度为5,小数位数为2,SQL语句如下:

    salary decimal(5,2)

精度表示为值存储的有效位数,小数位数表示可以存储在小数点后的位数。decimal(5,2)可以用于存储具有5位数字和两位小数的任何数值,因此定义为此数据类型的salary列的取值范围为-999.99~999.99。如果decimal小数位数为0,则值不包含小数点或小数部分,但定义为decimal数据类型的列的实际取值范围可能会受到所定义的精度或小数位数的限制。如果给定义为decimal数据类型的列分配的值的小数点后的位数超过所允许的位数,那么数值会被截断到允许的位数。表3-2是decimal数据类型的详细说明。

表3-2 decimal数据类型的详细说明

3.浮点类型

float和double数据类型表示的是浮点数据类型。在MySQL中,单精度浮点数使用4字节,双精度浮点数使用8字节。表3-3是float和double数据类型的详细说明。

表3-3 float和double数据类型的详细说明

需要注意的是,如果要使程序具有最大的可移植性,那么在定义浮点数据的类型时,应该定义为float或double precision数据类型,且不要指定精度或位数。

4.位值类型

即bit类型,它的表示方式为bit(m),m的取值范围为1~64。bit类型存储的是二进制字符串。

bit类型的数据范围为bit(1)~bit(64),换算成十进制,其值的取值范围为0~2 64 -1;tinyint unsigned类型的数值取值范围为0~255(十进制数)。bit类型占用的存储空间近似为(m+7)/8字节,而tinyint类型的存储空间为1字节。当使用bit(1)和tinyint时,它们占用的存储空间是一致的。

5.超出范围和溢出处理

当MySQL在数值列中存储超出列数据类型允许范围的值时,其结果取决于当时启用的SQL模式:

· 如果启用了严格的SQL模式,那么MySQL会根据SQL标准拒绝超出范围的值并显示错误提示信息,表明插入操作失败。

· 如果没有启用限制模式,那么MySQL会将插入的值截断为列数据类型范围的边界值来存储。

· 当把超出定义范围的值分配给定义为整数的列时,MySQL将把列数据类型范围的边界值存储到列中。

· 当为浮点或定点类型的列分配的值超出指定(或默认)精度和小数位数所隐含的范围时,MySQL将把列数据类型范围的边界值存储到列中。

1)超出范围处理

例3.2 假设表t1具有以下定义:

    create table t1 (i1 tinyint, i2 tinyint unsigned);

(1)启用严格SQL模式后,会出现超出范围的错误。

使用如下命令启用数据库的严格SQL模式:

    mysql> set sql_mode = 'traditional';

在启用数据库的严格SQL模式下,插入超过数据类型范围的数值会被拒绝插入并抛出异常:

    mysql> insert into t1 (i1, i2) values(256, 256);
    ERROR 1264 (22003): Out of range value for column 'i1' at row 1mysql> select * FROM
t1;Empty set (0.00 sec)

(2)如果未启用严格SQL模式,则会发出警告,但是不会报错。

使用如下语句设置未启用严格SQL模式:

    mysql> set sql_mode = '';

如下语句是在未启用严格SQL模式的情况下插入超过数据类型范围的数值:

    mysql> insert into t1 (i1, i2) values(256, 256);

如下语句是在查询上面的插入语句时出现的警告信息:

如下语句用来检验当插入的数值超出数据类型的范围时,数值是否会插入数据表中:

从结果可知,如果不启用严格SQL模式,在数值超过数据类型范围的情况下依然会把数据添加到数据表中,只不过发出了警告,同时实际插入的数值是数据类型范围的边界值,在本例中有边界,即为最大值。

2)溢出处理

数值表达式计算期间的溢出会导致错误。

例3.3 有符号bigint值的最大值是9223372036854775807,因此以下语句会产生错误:

    mysql> select 9223372036854775807 + 1;
    ERROR 1690 (22003): bigint value is out of range in '(9223372036854775807 + 1)'

在这种情况下,要想操作成功,可以将结果值转换为无符号数。

发生溢出的原因是结果值超过了数据类型范围的上限,所以处理上面这种错误的另一种方法就是修改数值的数据类型,例如把数值类型修改为浮点类型,因为浮点类型的取值范围大,对于此例不会出现异常情况:

在默认情况下,unsigned整数值之间的减法(其中一个类型为unsigned)会产生一个无符号结果值。如果结果值是负数,则会导致错误:

        mysql> set sql_mode = '';
        Query OK, 0 rows affected (0.00 sec)
        mysql> select cast(0 as unsigned) - 1;
        ERROR 1690 (22003): bigint unsigned value is out of range in '(cast(0 as unsigned)
    - 1)'

如果no_unsigned_subtraction启用了SQL模式,则不会出现执行语句的异常:

3.2 日期和时间数据类型

表示时间值的日期和时间类型有这样几种:datetime、date、timestamp、time和year。每种时间类型都有一个有效值范围和一个“零”值,当指定不符合规则的日期或时间数据时,MySQL将使用“零”值来替换。

使用日期和时间类型时,需要注意以下事项:

· MySQL以标准格式输出给定的日期或时间类型的值。如果使用日期或时间类型的格式不恰当,可能会出现不可预测的结果。

· MySQL尝试以多种格式解释用户输入的值,但是日期部分必须按年-月-日的顺序给出(例如'21-06-01'),不能使用月-日-年或日-月-年的顺序(例如'01-06-21'、'06-01-21')。如果要将其他顺序的字符串转换为年-月-日的顺序,可以使用str_to_date()函数进行转换。

· 对于包含2位数年份值的不明确日期,MySQL会使用以下规则进行解释:

➢ 70—99范围内的年份值转换为1970—1999。

➢ 00—69范围内的年份值转换为2000—2069。

· 默认情况下,当MySQL遇到无效的日期或时间类型的值时,会将该值转换为该类型的“零”值。如果时间类型的值超出范围,那么此值会被剪裁到时间范围的相应端点。

· MySQL允许将“零”值'0000-00-00'存储为“虚拟日期”。在某些情况下,这比使用null值更方便,并且使用更少的数据和索引空间。要禁止存储'0000-00-00'为“虚拟日期”,可以启用no_zero_date模式(set session sql_mode='strict_trans_tables,no_zero_date';)。

表3-4是所有日期和时间类型格式的详细说明。

表3-4 所有日期和时间类型格式的详细说明

3.3 字符串数据类型

在MySQL中,字符串数据类型有这样几种:char、varchar、text、binary、varbinary、blob、enum和set。对于数据类型定义为char、varchar和text的列,MySQL以字符为单位定义长度规范。对于数据类型定义为binary、varbinary和blob的列,MySQL以字节为单位定义长度规范。

当列定义为char、varchar、enum和set的数据类型时,同时还可以指定列的字符集,尤其在存储中文时,建议指定字符集格式为utf8,以防止出现乱码问题。

例3.4 创建表指定字段类型时设置字符集格式。创建一个名为c1的列,该列的字符集为utf8,以及一个名为c2的列,该列的字符集为latin1,SQL语句如下:

    create table mytable
    (
       c1 varchar(255) character set utf8,
       c2 text character set latin1 collate latin1_general_cs
    );
1.char和varchar类型

在MySQL中,char和varchar类型很相似,但是它们被存储和检索的方式有所不同,而且在最大长度和是否保留尾随空格方面也不相同。

char和varchar类型的声明需要规定存储的最大字符数。例如,char(50)最多可容纳50个字符。char类型的列规定的长度可以是0~255的任何值。char类型的列存储值时,会用空格向右填充到指定的长度。当设置启用SQL模式(即执行“set sql_mode= 'pad_char_to_full_length';”)时,char类型列被检索到的值,其尾随的空格不会被删除。

varchar类型列中的值是可变长度的字符串。长度可以指定为0~65535的值。varchar的有效最大长度受最大行大小和使用的字符集约束。与char值相比,varchar值存储1字节或2字节的长度字段。如果内容字段不超过255字节,则长度字段使用1字节;如果内容长度超过255字节,则长度字段使用2字节。

如果未启用严格SQL模式并且为char或varchar类型的列分配的值超过该列的最大长度,则该值将被截断并生成警告信息。对于非空格字符的截断,可以使用严格的SQL模式提示错误(而不是警告)并禁止插入值。对于varchar类型的列,无论使用哪种SQL模式,超出列规定长度的尾随空格在插入之前都会被截断并生成警告信息。对于char列,无论使用哪种SQL模式,都会从插入的值中截断多余的尾随空格。

表3-5展示了char和varchar类型的差别(假设该列使用单字节字符集)。

表3-5 char和varchar类型的差别

如果给定的值存储在char(4)和varchar(4)列中,则从列中检索到的值并不总是相同的,因为char类型列检索时会从列中删除尾随空格。

例3.5 说明char和varchar类型的差异的示例SQL语句及其执行结果如下:

2.binary和varbinary类型

在MySQL中,binary和varbinary类型很相似。与char、varchar类型不同的是,它们存储的是字符串而不是字节串,而且binary和varbinary类型是以字节为单位来测量长度的,而不是以字符为单位。

当binary类型值被存储时,用右填充模式填充值到指定的长度,填充值是0x00(0字节)。也就是说当插入数据时,使用0x00向右填充,并且没有为检索删除尾随字节。比如,binary(3)列插入'a '时变成'a\0\0',插入'a\0'时变成'a\0\0',两个插入的值在检索时保持不变。

例3.6 binary类型的值被存储时,填充值“0x00”影响列值存储的示例SQL语句及其执行结果如下:

如上示例说明新增的值'a'最终被填充成'a\0\0'存储。

和binary类型不同的是,varbinary类型列中的值是可变长度的字节串。在插入值时不会使用0x00填充,查询的时候也不会丢弃任何字节。在对列值进行比较的时候,所有的字节都是有效的,并且0x00<space(space对应的是0x20)。

3.blob和text类型

blob类型的值是一个二进制的大对象,可以容纳可变数量的数据。tinyblob、blob、mediumblob和longblob类型的区别仅在于它们可以存储的值的最大长度不相同。

blob类型的值被视为二进制字符串(字节字符串),具有二进制字符集和排序规则,基于列值中字节的数值对值进行排序和比较。text类型的值被视为非二进制字符串(字符串),具有除二进制之外的字符集,并且根据字符集的排序规则对值进行排序和比较。表3-6是这几种类型数据的存储范围和使用用途说明。

表3-6 字符串数据的存储范围和使用用途说明

各个类型可存储的最大长度根据实际情况进行选择。

4.enum类型

enum类型(即枚举类型)的列值表示一个字符串对象,其值选自在表创建时列规范的枚举值。enum类型具有以下优点:

· 在列具有有限的数据集合的情况下压缩数据空间。输入的字符串会自动编码为数字。

· 可读的查询和输出。在查询时,实际存储的数字被转换为相应字符串。

1)创建和使用enum列

枚举值必须是带引号的字符串。

例3.7 创建和使用enum列的示例SQL语句及其执行结果如下:

示例说明:在给字段使用enum类型的时候,MySQL服务会自动给枚举的字符串添加索引编号,因此在操作过程中可以直接操作枚举值,也可以操作枚举索引编号。

使用枚举的时候,需要注意下面两个问题:

· 容易混淆。enum类型的字段在底层其实是用整型来存储的,比如用enum类型来存储'3'、'2'、'1'这样的数字字符串时,其对应的索引编号是1、2、3,不熟悉的开发人员很容易混淆。

· 字段值修改频繁的字段不适合使用enum类型。比如例3.7中的size字段,要增加一个尺寸,就要修改字段,给字段的enum类型增加一个尺寸枚举值。如果每增加一个枚举就要修改字段,这样维护成本较高,所以遇到这种情况不建议使用enum类型。

2)枚举文字的索引编号

每个枚举值都有一个索引编号,列规范中列出的元素都分配有索引编号,索引编号从1开始。空字符串的索引编号为0,因此可以使用以下select语句查找enum类型列是否分配了无效值的行:

    mysql> select * from tb_name where enum_col=0;

表3-7是枚举值和索引编号的规则说明。

表3-7 枚举值和索引编号的规则说明

使用enum类型列需要注意的是,最多只能有65535个不同的元素,即最多只能有65535个不同的枚举值。

如果要检索枚举的索引编号,可以通过如下语句去查询:

    mysql>  select enum_col+0 from tbl_name;
5.set类型

set类型(集合类型)的列值表示可以有零个或多个字符串对象。一个set类型的列最多可以有64个不同的成员值,并且每个值必须从创建表时指定的值列表中选择。set类型由多个逗号分隔的列值集合组成,set类型成员值本身不应包含逗号。

例3.8 指定set('one', 'two') not null的列可以具有以下任何值:

    ''
    'one'
    'two'
    'one,two'

如果要将数字存储到set列中,则对于指定的列set('a','b','c','d'),其成员应具有如表3-8所示的十进制值和二进制值。

表3-8 set类型字段值的十进制值和二进制值

无论插入值时元素的顺序是怎样的,查询展示时都是根据创建表指定的顺序列出的,而且无论插入值的次数是多少,该值中的每个元素都只会出现一次。

例3.9 查询包含多个set元素的值,示例SQL语句如下:

    # 一列被指定为set('a','b','c','d'):
    mysql> create table myset (col set('a', 'b', 'c', 'd'));

    # 如果插入值'a,d','d,a','a,d,d','a,d,a',和'd,a,d'
    mysql> insert into myset (col) values
    -> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
    Query OK, 5 rows affected (0.01 sec)
    Records: 5  Duplicates: 0  Warnings: 0

最终查询的结果如下:

需要注意的是,当插入的值不为系统所支持时,该值将被忽略并发出警告。

例3.10 往set列中插入的值不为系统所支持时,SQL语句及其执行结果如下:

如上示例插入的值不被系统所支持时,系统发出了警告,只将支持的数据插入表中。

3.4 JSON数据类型

MySQL支持JSON数据类型,JSON数据类型具有如下优势:

· 存储在JSON类型列中的JSON文档会被自动验证,无效的文档会产生错误。

· 存储在JSON类型列中的JSON文档会被转换为允许快速读取文档元素的内部格式。

· 在MySQL 8中,优化器可以执行JSON类型列的局部就地更新,而不用删除旧文档后再将整个新文档写入该列。

在MySQL中,JSON类型列的值被写为字符串。如果字符串不符合JSON数据格式,则会产生错误。

例3.11 插入无效的JSON值,示例SQL语句及其执行结果如下:

    mysql> create table t1 (jdoc json);
    Query OK, 0 rows affected (0.20 sec)

    mysql> insert into t1 values('{"key1": "value1", "key2": "value2"}');
    Query OK, 1 row affected (0.01 sec)

    mysql> insert into t1 values('[1, 2,');
    ERROR 3140 (22032) at line 2: Invalid JSON text:
    "Invalid value." at position 6 in value (or column) '[1, 2,'.

从示例中可以看出,第3条语句插入的值明显不是JSON数据格式,所以抛出了异常。

1.JSON操作函数
1)json_type()函数

用于返回对应的数据类型。

例3.12 json_type()函数的使用,示例SQL语句及其执行结果如下:

由此可见,当值是JSON格式时,json_type函数可以查询出该值的数据类型,当值不是JSON格式时,则会抛出异常。

2)json_array()函数(参数可以为空)

用于返回参数值的JSON数组。

例3.13 json_array()函数的使用,示例SQL语句及其执行结果如下:

这两条查询分别用于将一个字符串“a”转换为JSON数组和获取空的JSON数组。

3)json_object函数(参数可以为空)

用于返回键-值对(Key-Value Pair)的JSON对象。

例3.14 json_object函数的使用,示例SQL语句及其执行结果如下:

将字符串转换为JSON对象,其中包含两个键-值对,即"key1": "a","key2": "b"。

4)json_merge_preserve()函数

用于获取两个或多个JSON文档并返回组合结果。

例3.15 json_merge_preserve()函数的使用,示例SQL语句及其执行结果如下:

将两个JSON数组合并成一个JSON对象。

5)json_merge_patch()函数

用于返回多个JSON数据合并之后的对象。

例3.16 json_merge_patch()函数的使用,示例SQL语句及其执行结果如下:

将3个JSON对象合并为1个。

6)json_extract()函数

用于提取JSON对象值。

例3.17 json_extract()函数的使用,示例SQL语句及其执行结果如下:

第一条查询用于提取JSON对象中“name”键对应的值。

第二条查询用于提取JSON对象中所有的键-值对。

7)json_extract()函数

用于提取JSON数组值。

例3.18 json_extract()函数的使用,示例SQL语句及其执行结果如下:

8)json_replace()函数

用于替换值。

例3.19 json_replace()函数的使用,示例SQL语句及其执行结果如下:

将JSON字符串中名为“name”的属性值替换为“clay2”。

9)json_set()函数

用于设置值(替换旧值,并插入不存在的新值)。

例3.20 json_set()函数的使用,示例SQL语句及其执行结果如下:

10)json_insert()函数

用于插入值(插入新值,但不替换已经存在的旧值)。

例3.21 json_insert()函数的使用,示例SQL语句及其执行结果如下:

11)json_remove()函数

删除JSON数据,删除指定值后的JSON文档。

例3.22 json_remove()函数的使用,示例SQL语句及其执行结果如下:

2.JSON值和非JSON值转换

在MySQL中操作JSON类型时,除了前面给出的各种函数之外,在实际开发中经常还会出现JSON类型和其他数据类型转换的情况,表3-9是JSON类型和其他数据类型转换时遵循的规则说明。

表3-9 JSON类型和其他数据类型转换遵循的规则说明

3.5 本章练习

1.创建一张用户信息表,要求性别字段的数据类型为enum类型。

2.说出float和double数据类型的区别。 nlPBe57PBJl6vCfn9gwZDQvBvgPgURxrmGXGd+ob4v66+4mPgz307oZ1byCGv++F

点击中间区域
呼出菜单
上一章
目录
下一章
×