Mariadb 简明教程

MariaDB - Quick Guide

MariaDB - Introduction

数据库应用程序独立于主应用程序而存在,并存储数据集合。每个数据库都使用一个或多个 API 来创建、访问、管理、搜索和复制它包含的数据。

数据库还使用非关系数据源,如对象或文件。但是,对于大型数据集而言,数据库被证明是最佳选择,而使用其他数据源会使检索和写入变得缓慢。

关系数据库管理系统或 RDBMS 将数据存储在不同的表中。通过使用主键和外键建立这些表之间的关系。

RDBMS 提供以下功能

  1. 它们使你能够使用表、列和索引实现数据源。

  2. 它们确保跨多张表的行之间引用的完整性。

  3. They automatically update indices.

  4. 它们解释 SQL 查询和操作,用于操作数据或从表中获取数据。

RDBMS Terminology

在我们开始讨论 MariaDB 之前,让我们回顾一下与数据库相关的一些术语。

  1. Database − 数据库是一个数据源,由包含相关数据的表组成。

  2. Table − 表,即电子表格,是一个包含数据的矩阵。

  3. Column − 列,即数据元素,是一种保存一种类型数据的结构;例如发货日期。

  4. Row − 行是分组相关数据的结构;例如客户数据。它也称为元组、条目或记录。

  5. Redundancy − 该术语指为了加速系统而存储两次数据。

  6. Primary Key − 该术语指一个唯一的识别值。该值在表中不会出现两次,并且只与它关联了一行。

  7. Foreign Key −外键用作两个表之间的链接。

  8. Compound Key −复合键或联合键,指的是多个列的键。它指的是多个列,这是因为某个列缺乏唯一的质量。

  9. Index −索引和书的索引几乎完全相同。

  10. Referential Integrity −此术语指的是确保所有外键值都指向现有行。

MariaDB Database

MariaDB 是由 MySQL 的原开发者创建的 MySQL 一个流行的分支。它源自对甲骨文收购 MySQL 的担忧。它为小型数据处理任务和企业需求提供支持。它旨在作为 MySQL 的模块化替代品,只需卸载 MySQL 并安装 MariaDB。MariaDB 提供了与 MySQL 相同的功能,并提供了更多功能。

Key Features of MariaDB

MariaDB 的重要功能包括:

  1. 所有的 MariaDB 都在 GPL、LGPL 或 BSD 中。

  2. MariaDB 包括各种存储引擎,包括高性能存储引擎,用于处理其他 RDBMS 数据源。

  3. MariaDB 使用标准且流行的查询语言。

  4. MariaDB 在许多操作系统上运行并支持广泛的编程语言。

  5. MariaDB 为 PHP 提供支持,这是最流行的 Web 开发语言之一。

  6. MariaDB 提供 Galera 集群技术。

  7. MariaDB 还提供 MySQL 中不可用的许多操作和命令,并消除或更换影响性能不佳的功能。

Getting Started

在开始本教程之前,请确保你已经具备了 PHP 和 HTML 的一些基本知识,特别是我们 PHP 和 HTML 教程中讨论的内容。

本指南重点介绍了在 PHP 环境中使用 MariaDB,因此我们的示例将对 PHP 开发人员最有用。

如果你不熟悉或需要查看,我们强烈建议你查看我们的 PHP 教程。

MariaDB - Installation

MariaDB 的所有下载都位于官方 MariaDB 基金会网站的 Download 部分。单击你想要的版本的链接,然后会显示一个可用于多个操作系统、体系结构和安装文件类型的下载列表。

Installing on LINUX/UNIX

如果你对 Linux/Unix 系统有深入的了解,只需下载源来构建安装。我们建议的安装方式是使用发行版包。MariaDB 为以下 Linux/Unix 发行版提供包:

  1. RedHat/CentOS/Fedora

  2. Debian/Ubuntu

以下发行版在其存储库中包含 MariaDB 包:

  1. openSUSE

  2. Arch Linux

  3. Mageia

  4. Mint

  5. Slackware

要在 Ubuntu 环境中安装,请按照以下步骤操作 -

Step 1 - 以 root 用户身份登录。

Step 2 - 导航到包含 MariaDB 包的目录。

Step 3 - 使用以下代码导入 GnuPG 签名密钥 -

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

Step 4 - 将 MariaDB 添加到 sources.list 文件中。打开该文件,并添加以下代码 -

sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntuprecise main'

Step 5 - 使用以下内容刷新系统 -

sudo apt-get update

Step 6 - 使用以下内容安装 MariaDB -

sudo apt-get install mariadb-server

Installing on Windows

在找到并下载自动安装文件 (MSI) 后,只需双击该文件即可开始安装。安装向导将引导您完成安装的每一步和任何必需的设置。

通过从命令提示符启动安装来测试安装。导航到安装位置,通常在该目录中,并在提示符处键入以下内容 -

mysqld.exe --console

如果安装成功,您将看到与启动相关的消息。如果未显示此消息,您可能存在权限问题。确保您的用户帐户可以访问该应用程序。在 Windows 环境中可用于 MariaDB 管理的图形客户端。如果您觉得命令行不方便或繁琐,请务必尝试使用它们。

Testing the Installation

执行一些简单任务来确认 MariaDB 的功能和安装。

Use the Admin Utility to Get Server Status

使用 mysqladmin 二进制文件查看服务器版本。

[root@host]# mysqladmin --version

它应该显示版本、发行版、操作系统和架构。如果您没有看到该类型的输出,请检查您的安装是否存在问题。

Execute Simple Commands with a Client

调出 MariaDB 的命令提示符。这应该使您连接到 MariaDB 并允许执行命令。输入以下简单命令 -

mysql> SHOW DATABASES;

Post- Installation

成功安装 MariaDB 后,设置 root 密码。新安装的密码将为空。输入以下内容设置新密码 -

mysqladmin -u root password "[enter your password here]";

输入以下内容以使用您的新凭据连接到服务器 -

mysql -u root -p
Enter password:*******

Upgrading on Windows

如果您已经在 Windows 系统上安装了 MySQL,并且想要升级到 MariaDB,请不要卸载 MySQL 并安装 MariaDB。这将与现有数据库产生冲突。相反,您必须安装 MariaDB,然后使用 Windows 安装文件中的升级向导。

你的 MySQL my.cnf 文件的选项应与 MariaDB 兼容。但是,MariaDB 有许多 MySQL 中没有的功能。

考虑 my.cnf 文件中的以下冲突——

  1. * MariaDB 默认使用 Aria 存储引擎处理临时文件。如果你有大量的临时文件,修改键缓冲区大小,如果你不使用 MyISAM 表。

  2. * 如果你的应用程序经常连接/断开连接,修改线程缓存大小。

  3. * 如果你使用超过 100 个连接,使用线程池。

Compatibility

MySQL 和 MariaDB 基本上是相同的。但是,两者之间有足够的差异会导致升级问题。请参阅 MariaDB Knowledge Base. 中的更多关键差异

MariaDB - Administration

在尝试运行 MariaDB 之前,先确定其当前状态,正在运行还是关闭。有三种启动和停止 MariaDB 的方法——

  1. * 运行 mysqld(MariaDB 二进制文件)。

  2. * 运行 mysqld_safe 启动脚本。

  3. * 运行 mysql.server 启动脚本。

如果你在非标准位置安装了 MariaDB,你可能需要编辑脚本文件中的位置信息。通过使用脚本来简单地添加一个“stop”参数来停止 MariaDB。

如果你想在 Linux 下自动启动它,将启动脚本添加到你的 init 系统。每个发行版都有不同的程序。请参阅你的系统文档。

Creating a User Account

使用以下代码创建新的用户帐户——

CREATE USER 'newusername'@'localhost' IDENTIFIED BY 'userpassword';

此代码将一行添加到用户表中,没有任何权限。你也可以选择使用密码的哈希值。使用以下代码授予用户权限——

GRANT SELECT, INSERT, UPDATE, DELETE ON database1 TO 'newusername'@'localhost';

其他权限包括 MariaDB 中几乎所有可能的命令或操作。在创建用户后,执行“FLUSH PRIVILEGES”命令以刷新授权表。这允许用户帐户被使用。

The Configuration File

在 Unix/Linux 上构建后,配置文件“/etc/mysql/my.cnf”应被编辑为如下所示——

# Example mysql config file.
# You can copy this to one of:
# /etc/my.cnf to set global options,
# /mysql-data-dir/my.cnf to get server specific options or
# ~/my.cnf for user specific options.

#

# One can use all long options that the program supports.
# Run the program with --help to get a list of available options

# This will be passed to all mysql clients
[client]
#password = my_password
#port = 3306
#socket = /tmp/mysql.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# The MySQL server
[mysqld]
#port = 3306
#socket = /tmp/mysql.sock
temp-pool

# The following three entries caused mysqld 10.0.1-MariaDB (and possibly other
   versions) to abort...
# skip-locking
# set-variable = key_buffer = 16M
# set-variable = thread_cache = 4

loose-innodb_data_file_path = ibdata1:1000M
loose-mutex-deadlock-detector
gdb

######### Fix the two following paths

# Where you want to have your database
data = /path/to/data/dir

# Where you have your mysql/MariaDB source + sql/share/english
language = /path/to/src/dir/sql/share/english

[mysqldump]
quick
MariaDB
8
set-variable = max_allowed_packet=16M
[mysql]
no-auto-rehash

[myisamchk]
set-variable = key_buffer = 128M

编辑行“data= ”和“language= ”以匹配你的环境。

在修改文件后,导航到源目录并执行以下操作——

./scripts/mysql_install_db --srcdir = $PWD --datadir = /path/to/data/dir --
   user = $LOGNAME

如果你已将数据目录添加到配置文件中,省略“$PWD”变量。确保在运行 MariaDB 版本 10.0.1 时使用“$LOGNAME”。

Administration Commands

使用 MariaDB 时会定期使用的重要命令列表:

  1. USE [database name] - 设置当前默认数据库。

  2. SHOW DATABASES - 列出当前服务器上的数据库。

  3. SHOW TABLES - 列出所有非临时表。

  4. SHOW COLUMNS FROM [table name] - 提供与指定表相关的列信息。

  5. SHOW INDEX FROM TABLENAME [table name] - 提供与指定表相关表索引信息。

  6. SHOW TABLE STATUS LIKE [table name]\G – - 提供有关非临时表的表,以及 LIKE 子句之后出现用于获取表名的模式。

MariaDB - PHP Syntax

MariaDB 与广泛的编程语言和框架(例如 PHP、C#、JavaScript、Ruby on Rails、Django 等)合作良好。PHP 由于其简单性和历史足迹,仍然是所有可用语言中最流行的语言。本指南将重点关注与 MariaDB 合作的 PHP。

PHP 提供了一组用于处理 MySQL 数据库的功能。这些功能执行诸如访问数据库或执行操作之类的任务,并且它们与 MariaDB 完全兼容。只需像调用任何其他 PHP 函数一样调用这些函数。

您用于 MariaDB 的 PHP 函数遵循以下格式:

mysql_function(value,value,...);

函数的第二部分指定其动作。本指南中使用的两个函数如下:

mysqli_connect($connect);
mysqli_query($connect,"SQL statement");

以下示例演示了对 MariaDB 函数的 PHP 调用的常规语法:

<html>
   <head>
      <title>PHP and MariaDB</title>
   </head>

   <body>
      <?php
         $retval = mysql_function(value, [value,...]);

         if( !$retval ) {
            die ( "Error: Error message here" );
         }
         // MariaDB or PHP Statements
      ?>
   </body>
</html>

在下一节中,我们将使用 PHP 函数检查基本的 MariaDB 任务。

MariaDB - Connection

与 MariaDB 建立连接的一种方法是使用命令提示符中的 mysql 二进制文件。

MYSQL Binary

查看下面给出的示例。

[root@host]# mysql -u root -p

Enter password:******

上面给出的代码连接到 MariaDB 并提供用于执行 SQL 命令的命令提示符。输入代码后,会显示一条欢迎消息,表明连接成功,并显示版本号。

Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 122323232
Server version: 5.5.40-MariaDB-log

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

该示例使用 root 访问,但具有权限的任何用户当然都可以访问 MariaDB 提示并执行操作。

通过 exit 命令断开与 MariaDB 的连接,如下所示:

mysql> exit

PHP Connection Script

连接到 MariaDB 并断开连接的另一种方法是使用 PHP 脚本。PHP 提供 mysql_connect() 函数用于打开数据库连接。它使用五个可选参数,并在连接成功后返回 MariaDB 链接标识符,或在连接不成功时返回 false。它还提供了 mysql_close() 函数用于关闭数据库连接,该函数使用单个参数。

Syntax

审阅以下 PHP 连接脚本语法 −

connection mysql_connect(server,user,passwd,new_link,client_flag);

参数说明如下 −

Sr.No

Parameter & Description

1

server 此可选参数指定运行数据库服务器的主机名。它的默认值为“localhost:.3036”。

2

user 此可选参数指定访问数据库的用户名。它的默认值是服务器的所有者。

3

passwd 此可选参数指定用户的密码。它的默认值是空白。

4

new_link 此可选参数指定在以相同参数再次调用 mysql_connect() 时返回当前连接的标识符,而不是新连接。

5

client flags 此可选参数使用以下常量值进行组合 −MYSQL_CLIENT_SSL − 它使用 ssl 加密。MYSQL_CLIENT_COMPRESS − 它使用压缩协议。MYSQL_CLIENT_IGNORE_SPACE − 它允许在函数名后使用空格。MYSQL_CLIENT_INTERACTIVE − 它允许在关闭连接前使用交互式超时(非活动秒数)。

审阅下面给出的 PHP 断开连接脚本语法 −

bool mysql_close ( resource $link_identifier );

如果您省略资源,最近打开的资源将关闭。它在成功关闭时返回 true 值,或者在失败时返回 false 值。

尝试以下示例代码以连接至 MariaDB 服务器 −

<html>
   <head>
      <title>Connect to MariaDB Server</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'guest1';
         $dbpass = 'guest1a';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);

         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }

         echo 'Connected successfully';
         mysql_close($conn);
      ?>
   </body>
</html>

成功连接后,您将看到以下输出 −

mysql> Connected successfully

MariaDB - Create Database

在 MariaDB 中创建或删除数据库通常需要特权,这些特权通常只授予 root 用户或管理员。在这些帐户下,您有两种创建数据库的选项 − mysqladmin 二进制文件和 PHP 脚本。

mysqladmin binary

以下示例演示了使用 mysqladmin 二进制文件创建名为 Products 的数据库 −

[root@host]# mysqladmin -u root -p create PRODUCTS
Enter password:******

PHP Create Database Script

PHP 在创建 MariaDB 数据库时采用 mysql_query 函数。该函数使用两个参数,一个可选,成功时返回“true”值,失败时返回“false”值。

Syntax

审阅以下 create database script 语法 −

bool mysql_query( sql, connection );

参数说明如下 −

S.No

Parameter & Description

1

sql 此必填参数包含执行操作所需的 SQL 查询。

2

connection 在未指定时,此可选参数使用最近使用的连接。

尝试以下示例代码以创建数据库 −

<html>
   <head>
      <title>Create a MariaDB Database</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);

         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }

         echo 'Connected successfully<br />';
         $sql = 'CREATE DATABASE PRODUCTS';
         $retval = mysql_query( $sql, $conn );

         if(! $retval ) {
            die('Could not create database: ' . mysql_error());
         }

         echo "Database PRODUCTS created successfully\n";
         mysql_close($conn);
      ?>
   </body>
</html>

成功删除后,您将看到以下输出 −

mysql> Database PRODUCTS created successfully
mysql> SHOW DATABASES;
+-----------------------+
| Database              |
+-----------------------+
| PRODUCTS              |
+-----------------------+

MariaDB - Drop Database

在 MariaDB 中创建或删除数据库需要拥有权限,通常只授予 root 用户或管理员。 在这些帐户下,您可以使用两种方法来删除数据库:mysqladmin 二进制文件和 PHP 脚本。

请注意,已删除的数据库无法恢复,所以在执行此操作时要小心。此外,用于删除的 PHP 脚本在删除前会 not 要求您确认。

mysqladmin binary

以下示例演示如何使用 mysqladmin 二进制文件删除现有数据库 −

[root@host]# mysqladmin -u root -p drop PRODUCTS
Enter password:******
mysql> DROP PRODUCTS
ERROR 1008 (HY000): Can't drop database 'PRODUCTS'; database doesn't exist

PHP Drop Database Script

PHP 使用 mysql_query 函数删除 MariaDB 数据库。该函数使用两个参数,一个可选参数,并在成功时返回 “true” 值,在不成功时返回 “false” 值。

Syntax

查看以下删除数据库脚本语法 −

bool mysql_query( sql, connection );

参数说明如下 −

Sr.No

Parameter & Description

1

sql 此必填参数包含执行操作所需的 SQL 查询。

2

connection 在未指定时,此可选参数使用最近使用的连接。

尝试以下示例代码来删除数据库 −

<html>
   <head>
      <title>Delete a MariaDB Database</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);

         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';

         $sql = 'DROP DATABASE PRODUCTS';
         $retval = mysql_query( $sql, $conn );

         if(! $retval ){
            die('Could not delete database: ' . mysql_error());
         }

         echo "Database PRODUCTS deleted successfully\n";
         mysql_close($conn);
      ?>
   </body>
</html>

成功删除后,您将看到以下输出 −

mysql> Database PRODUCTS deleted successfully

MariaDB - Select Database

连接到 MariaDB 后,您必须选择一个数据库以供使用,因为可能存在多个数据库。有两种方法可以执行此任务:从命令提示符或通过 PHP 脚本。

The Command Prompt

要从命令提示符选择一个数据库,只需使用 SQL 命令 ‘use’

[root@host]# mysql -u root -p

Enter password:******

mysql> use PRODUCTS;

Database changed

mysql> SELECT database();
+-------------------------+
| Database                |
+-------------------------+
| PRODUCTS                |
+-------------------------+

选择数据库后,所有后续命令都将在所选数据库上操作。

Note − 所有名称(例如,数据库、表、字段)都区分大小写。确保命令符合正确的格式。

PHP Select Database Script

PHP 提供 mysql_select_db 函数来进行数据库选择。该函数使用两个参数,一个可选参数,并在成功选择时返回 “true” 值,在失败时返回 “false” 值。

Syntax

查看以下选择数据库脚本语法。

bool mysql_select_db( db_name, connection );

参数说明如下 −

S.No

Parameter & Description

1

db_name 这个必需参数指定要使用的数据库的名称。

2

connection 在未指定时,此可选参数使用最近使用的连接。

尝试以下示例代码来选择一个数据库 −

<html>
   <head>
      <title>Select a MariaDB Database</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'guest1';
         $dbpass = 'guest1a';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);

         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully';

         mysql_select_db( 'PRODUCTS' );
         mysql_close($conn);
      ?>
   </body>
</html>

成功选择后,您将看到以下输出 −

mysql> Connected successfully

MariaDB - Data Types

良好的字段定义对于优化数据库至关重要。理想的方法要求您仅使用所需类型和大小的字段。例如,如果您只使用一个字段,宽度为五个字符,则不要定义一个宽度为 20 个字符的字段。字段(或列)类型也称为数据类型,因为数据类型存储在字段中。

MariaDB 数据类型可以分为数值、日期和时间以及字符串值。

Numeric Data Types

MariaDB 支持的数值数据类型如下 −

  1. TINYINT − 此数据类型表示落在 -128 到 127 的带符号范围和小整数,落在 0 到 255 的无符号范围。

  2. BOOLEAN − 此数据类型将值 0 与“false”关联,将值 1 与“true”关联。

  3. SMALLINT − 此数据类型表示范围在 -32768 到 32768 之间的有符号整数,以及范围在 0 到 65535 之间的无符号整数。

  4. MEDIUMINT − 此数据类型表示范围在 -8388608 到 8388607 之间的有符号整数,以及范围在 0 到 16777215 之间的无符号整数。

  5. INT(also INTEGER) − 此数据类型表示正常大小的整数。如果标记为无符号,则范围为 0 到 4294967295。如果是有符号(默认设置),则范围为 -2147483648 到 2147483647。如果将列设置为 ZEROFILL(无符号状态),则会在其所有值前加上零,在 INT 值中放置 M 位数。

  6. BIGINT − 此数据类型表示范围在 9223372036854775808 到 9223372036854775807 之间的有符号整数,以及范围在 0 到 18446744073709551615 之间的无符号整数。

  7. DECIMAL (也为 DEC、NUMERIC、FIXED) − 此数据类型表示精确定点数,其中 M 指定其位数,D 指定小数点后的位数。M 值不会添加“-”或小数点。如果将 D 设置为 0,则不会出现小数或分数部分,并且值将在 INSERT 时四舍五入到最接近的 DECIMAL。允许的最大位数为 65,小数部分的最大位数为 30。如果省略,M 的默认值为 10,D 的默认值为 0。

  8. FLOAT − 此数据类型表示值为 0 或以下范围内的较小浮点数 -3.402823466E+38 到 -1.175494351E-381.175494351E-38 到 3.402823466E+38

  9. DOUBLE (也为 REALDOUBLE PRECISION) − 此数据类型表示值为 0 或以下范围内的正常大小浮点数 -1.7976931348623157E+308 到 -2.2250738585072014E-3082.2250738585072014E-308 到 1.7976931348623157E+308

  10. BIT − 此数据类型表示位字段,其中 M 指定每个值中的位数。如果省略 M,则默认值为 1。可以使用“b’[value]’”应用位值,其中 value 表示 0 和 1 中的位值。会自动从左侧填充零以达到全长;例如,“10”变为“0010”。

Date and Time Data Types

MariaDB 支持的日期和时间数据类型如下 −

  1. DATE − 此数据类型表示日期范围“1000-01-01”到“9999-12-31”,并使用“YYYY-MM-DD”日期格式。

  2. TIME − 此数据类型表示时间范围“-838:59:59.999999”到“838:59:59.999999”。

  3. DATETIME − 此数据类型表示范围“1000-01-01 00:00:00.000000”到“9999-12-31 23:59:59.999999”。它使用“YYYY-MM-DD HH:MM:SS”格式。

  4. TIMESTAMP − 此数据类型表示“YYYY-MM-DD HH:MM:DD”格式的时间戳。主要用于详细说明数据库修改的时间,例如,插入或更新。

  5. YEAR − 此数据类型表示 4 位格式的年份。四位格式允许范围在 1901 到 2155,以及 0000 之间的数值。

String DataTypes

MariaDB 支持的字符串类型值如下 −

  1. String literals − 此数据类型表示用引号引起来的一系列字符。

  2. CHAR − 此数据类型表示右填充、固定长度的字符串,其中包含指定长度的空格。M 表示字符列长度,范围为 0 到 255,其默认值为 1。

  3. VARCHAR − 此数据类型表示可变长度字符串,最大列长度 (范围) 为 0 到 65535。

  4. BINARY - 此数据类型表示二进制字节串,其中 M 为按字节计的列长度。

  5. VARBINARY - 此数据类型表示可变长度的二进制字节串,其中 M 为列长度。

  6. TINYBLOB - 此数据类型表示长度最多为 255(28 - 1)字节的二进制大对象列。在存储时,每个大对象使用一个字节长度前缀指示值中的字节量。

  7. BLOB - 此数据类型表示长度最多为 65,535(216 - 1)字节的二进制大对象列。在存储时,每个大对象使用两个字节长度前缀指示值中的字节量。

  8. MEDIUMBLOB - 此数据类型表示长度最多为 16,777,215(224 - 1)字节的二进制大对象列。在存储时,每个大对象使用三个字节长度前缀指示值中的字节量。

  9. LONGBLOB - 此数据类型表示长度最多为 4,294,967,295(232 - 1)字节的二进制大对象列。在存储时,每个大对象使用四个字节长度前缀指示值中的字节量。

  10. TINYTEXT - 此数据类型表示长度最多为 255(28 - 1)个字符的文本列。在存储时,每个列使用一个字节长度前缀指示值中的字节量。

  11. TEXT - 此数据类型表示长度最多为 65,535(216 - 1)个字符的文本列。在存储时,每个列使用两个字节长度前缀指示值中的字节量。

  12. MEDIUMTEXT - 此数据类型表示长度最多为 16,777,215(224 - 1)个字符的文本列。在存储时,每个列使用三个字节长度前缀指示值中的字节量。

  13. LONGTEXT - 此数据类型表示长度最多为 4,294,967,295 或 4GB(232 - 1)个字符的文本列。在存储时,每个列使用四个字节长度前缀指示值中的字节量。

  14. ENUM - 此数据类型表示仅从列表中具单个值的字符串对象。

  15. SET - 此数据类型表示从列表中具有零个或多个值(最多 64 个成员)的字符串对象。集合值在内部显示为整数值。

MariaDB - Create Tables

在本教程中,我们将学习如何创建表。在创建表之前,首先要确定其名称、字段名和字段定义。

以下是一般创建表语法:

CREATE TABLE table_name (column_name column_type);

查看用于在 PRODUCTS 数据库中创建表的命令:

databaseproducts_ tbl(
   product_id INT NOT NULL AUTO_INCREMENT,
   product_name VARCHAR(100) NOT NULL,
   product_manufacturer VARCHAR(40) NOT NULL,
   submission_date DATE,
   PRIMARY KEY ( product_id )
);

上述示例使用“NOT NULL”作为字段属性,以避免因空值引起的错误。属性“AUTO_INCREMENT”指示 MariaDB 将下一个可用值添加到 ID 字段。关键字 primary key 定义列为 primary key 。多个以逗号分隔的列可以定义一个主键。

创建表的两种主要方法是使用命令提示符和 PHP 脚本。

The Command Prompt

使用 CREATE TABLE 命令执行任务,如下所示:

root@host# mysql -u root -p
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> CREATE TABLE products_tbl(
   -> product_id INT NOT NULL AUTO_INCREMENT,
   -> product_name VARCHAR(100) NOT NULL,
   -> product_manufacturer VARCHAR(40) NOT NULL,
   -> submission_date DATE,
   -> PRIMARY KEY ( product_id )
   -> );
mysql> SHOW TABLES;
+------------------------+
| PRODUCTS               |
+------------------------+
| products_tbl           |
+------------------------+

确保用分号终止所有命令。

PHP Create Table Script

PHP 提供了 mysql_query() 用于创建表。其第二个参数包含必要的 SQL 命令 −

<html>
   <head>
      <title>Create a MariaDB Table</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);

         if(! $conn ){
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';

         $sql = "CREATE TABLE products_tbl( ".
            "product_id INT NOT NULL AUTO_INCREMENT, ".
            "product_name VARCHAR(100) NOT NULL, ".
            "product_manufacturer VARCHAR(40) NOT NULL, ".
            "submission_date DATE, ".
            "PRIMARY KEY ( product_id )); ";

         mysql_select_db( 'PRODUCTS' );
         $retval = mysql_query( $sql, $conn );

         if(! $retval ) {
            die('Could not create table: ' . mysql_error());
         }
         echo "Table created successfully\n";

         mysql_close($conn);
      ?>
   </body>
</html>

成功创建表后,您将看到以下输出 −

mysql> Table created successfully

MariaDB - Drop Tables

在本章中,我们将学习如何删除表。

删除表非常容易,但请记住,所有已删除的表是不可恢复的。表删除的一般语法如下 −

DROP TABLE table_name ;

有两种执行表删除操作的方法:使用命令提示符或 PHP 脚本。

The Command Prompt

在命令提示符下,只需使用 DROP TABLE SQL 命令 −

root@host# mysql -u root -p
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> DROP TABLE products_tbl

mysql> SELECT * from products_tbl
ERROR 1146 (42S02): Table 'products_tbl' doesn't exist

PHP Drop Table Script

PHP 提供了 mysql_query() 用于删除表。仅需将其第二个参数传递给相应的 SQL 命令 −

<html>
   <head>
      <title>Create a MariaDB Table</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);

         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';

         $sql = "DROP TABLE products_tbl";
         mysql_select_db( 'PRODUCTS' );
         $retval = mysql_query( $sql, $conn );

         if(! $retval ) {
            die('Could not delete table: ' . mysql_error());
         }
         echo "Table deleted successfully\n";

         mysql_close($conn);
      ?>
   </body>
</html>

成功删除表后,您将看到以下输出 −

mysql> Table deleted successfully

MariaDB - Insert Query

在本章中,我们将学习如何在表中插入数据。

在表中插入数据需要使用 INSERT 命令。该命令的一般语法是 INSERT 后跟表名、字段和值。

查看其给出的以下一般语法 −

INSERT INTO tablename (field,field2,...) VALUES (value, value2,...);

该语句需要使用单引号或双引号来表示字符串值。该语句的其他选项包括 “INSERT…​SET” 语句、“INSERT…​SELECT” 语句以及其他几个选项。

Note − 仅适用于 INSERT 语句并且在其他地方使用时返回 NULL 的 VALUES() 函数出现在该语句中。

有两种执行该操作的方法:使用命令行或使用 PHP 脚本。

The Command Prompt

在提示符下,有许多执行选择操作的方法。下面给出了一个标准语句 −

belowmysql>
INSERT INTO products_tbl (ID_number, Nomenclature) VALUES (12345,“Orbitron 4000”);
mysql> SHOW COLUMNS FROM products_tbl;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| ID_number   | int(5)      |      |     |         |       |
| Nomenclature| char(13)    |      |     |         |       |
+-------------+-------------+------+-----+---------+-------+

您可以插入多行 −

INSERT INTO products VALUES (1, “first row”), (2, “second row”);

您还可以使用 SET 子句 −

INSERT INTO products SELECT * FROM inventory WHERE status = 'available';

PHP Insertion Script

在 PHP 函数中使用相同的 “INSERT INTO…​” 语句来执行该操作。您将再次使用 mysql_query() 函数。

查看下面给出的示例 −

<?php
   if(isset($_POST['add'])) {
      $dbhost = 'localhost:3036';
      $dbuser = 'root';
      $dbpass = 'rootpassword';
      $conn = mysql_connect($dbhost, $dbuser, $dbpass);

      if(! $conn ) {
         die('Could not connect: ' . mysql_error());
      }

      if(! get_magic_quotes_gpc() ) {
         $product_name = addslashes ($_POST['product_name']);
         $product_manufacturer = addslashes ($_POST['product_name']);
      } else {
         $product_name = $_POST['product_name'];
         $product_manufacturer = $_POST['product_manufacturer'];
      }
      $ship_date = $_POST['ship_date'];
      $sql = "INSERT INTO products_tbl ".
         "(product_name,product_manufacturer, ship_date) ".
         "VALUES"."('$product_name','$product_manufacturer','$ship_date')";

      mysql_select_db('PRODUCTS');
      $retval = mysql_query( $sql, $conn );

      if(! $retval ) {
         die('Could not enter data: ' . mysql_error());
      }

      echo "Entered data successfully\n";
      mysql_close($conn);
   }
?>

当数据插入成功时,您将看到以下输出 −

mysql> Entered data successfully

您还可以将验证语句与插入语句配合使用,例如检查以确保数据输入正确。MariaDB 为此目的包含许多选项,其中一些是自动的。

MariaDB - Select Query

在本章中,我们将学习如何从表中选择数据。

SELECT 语句检索选定的行。它们可以包括 UNION 语句、排序子句、LIMIT 子句、WHERE 子句、GROUP BY…​HAVING 子句和子查询。

复习以下一般语法 −

SELECT field, field2,... FROM table_name, table_name2,... WHERE...

SELECT 语句提供了多种指定所用表的选择 −

  1. database_name.table_name

  2. table_name.column_name

  3. database_name.table_name.column_name

所有选择语句都必须包含一个或多个 select expressions 。选择表达式由以下选项之一组成 −

  1. A column name.

  2. 使用运算符和函数的表达式。

  3. 指定 “table_name.*” 以选择给定表中的所有列。

  4. 使用字符 “*” 选择 FROM 子句中指定的所有表中的所有列。

可以在执行选择语句时使用命令提示符或 PHP 脚本。

The Command Prompt

在命令提示符处,如下执行语句 −

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT * from products_tbl
+-------------+---------------+
| ID_number   | Nomenclature  |
+-------------+---------------+
| 12345       | Orbitron 4000 |
+-------------+---------------+

PHP Select Script

在 PHP 函数中使用相同的 SELECT 语句来执行操作。您将再次使用 mysql_query() 函数。查看以下给出的示例 −

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name,product_manufacturer, ship_date FROM products_tbl';
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID :{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date : {$row['ship_date']} <br>".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

当数据检索成功时,您将看到以下输出 −

Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully

最佳实践建议在每次 SELECT 语句之后释放游标内存。PHP 提供了 mysql_free_result() 函数用于此目的。查看其用法,如下所示 −

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date FROM products_tbl';
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
      echo "Product ID :{$row[0]} <br> ".
         "Name: {$row[1]} <br> ".
         "Manufacturer: {$row[2]} <br> ".
         "Ship Date : {$row[3]} <br> ".
         "--------------------------------<br>";
   }

   mysql_free_result($retval);
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

MariaDB - Where Clause

WHERE 子句过滤各种语句,例如 SELECT、UPDATE、DELETE 和 INSERT。它们提供了用于指定动作的条件。它们通常出现在语句中的表名之后,其条件随之而来。WHERE 子句本质上就像一个 if 语句。

查看下面给出的 WHERE 子句的一般语法 −

[COMMAND] field,field2,... FROM table_name,table_name2,... WHERE [CONDITION]

注意 WHERE 子句的以下特性 −

  1. It is optional.

  2. 它允许指定任何条件。

  3. 它允许通过 AND 或 OR 操作符指定多个条件。

  4. 大小写敏感性仅适用于使用 LIKE 比较的语句。

WHERE 子句允许使用以下运算符 −

Operator

= !=

> <

>= ⇐

WHERE 子句可以在命令提示符或 PHP 脚本中使用。

The Command Prompt

在命令提示符下,只需使用标准命令 −

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT * from products_tbl WHERE product_manufacturer = 'XYZ Corp';
+-------------+----------------+----------------------+
| ID_number   | Nomenclature   | product_manufacturer |
+-------------+----------------+----------------------+
| 12345       | Orbitron 4000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12346       | Orbitron 3000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12347       | Orbitron 1000  | XYZ Corp             |
+-------------+----------------+----------------------+

使用 AND 条件查看示例 −

SELECT *
FROM products_tbl
WHERE product_name = 'Bun Janshu 3000';
AND product_id <= 344;

此示例结合 AND 和 OR 条件

SELECT *
FROM products_tbl
WHERE (product_name = 'Bun Janshu 3000' AND product_id < 344)
OR (product_name = 'Bun Janshu 3000');

PHP Scripts Using Where Clause

在使用 WHERE 子句的操作中使用 mysql_query() 函数 −

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date
      FROM products_tbl
      WHERE product_manufacturer = "XYZ Corp"';

   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID :{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date: {$row['ship_date']} <br> ".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

当数据检索成功时,您将看到以下输出 −

Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully

MariaDB - Update Query

UPDATE 命令通过更改值来修改现有字段。它使用 SET 子句来指定用于修改的列,并指定分配的新值。这些值可以是表达式或字段的默认值。设置默认值需要使用 DEFAULT 关键字。该命令还可以使用 WHERE 子句为更新指定条件和/或 ORDER BY 子句以按特定顺序更新。

复习以下一般语法 −

UPDATE table_name SET field=new_value, field2=new_value2,...
[WHERE ...]

从命令提示符或使用 PHP 脚本执行 UPDATE 命令。

The Command Prompt

在命令提示符下,只需使用标准命令根 −

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> UPDATE products_tbl
   SET nomenclature = 'Fiber Blaster 300Z' WHERE ID_number = 112;
mysql> SELECT * from products_tbl WHERE ID_number='112';
+-------------+---------------------+----------------------+
| ID_number   | Nomenclature        | product_manufacturer |
+-------------+---------------------+----------------------+
| 112         | Fiber Blaster 300Z  | XYZ Corp             |
+-------------+---------------------+----------------------+

PHP Update Query Script

在 UPDATE 命令语句中使用 mysql_query() 函数 −

<?php
   $dbhost = ‘localhost:3036’;
   $dbuser = ‘root’;
   $dbpass = ‘rootpassword’;
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die(‘Could not connect: ‘ . mysql_error());
   }

   $sql = ‘UPDATE products_tbl
      SET product_name = ”Fiber Blaster 300z”
      WHERE product_id = 112’;

   mysql_select_db(‘PRODUCTS’);
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die(‘Could not update data: ‘ . mysql_error());
   }

   echo “Updated data successfully\n”;
   mysql_close($conn);
?>

在成功更新数据后,您将看到以下输出 −

mysql> Updated data successfully

MariaDB - Delete Query

DELETE 命令从指定表中删除表行,并返回已删除的数量。使用 ROW_COUNT() 函数访问已删除的数量。WHERE 子句指定行,并且在没有它的时候,所有行都将被删除。LIMIT 子句控制已删除的行数。

在针对多行的 DELETE 语句中,它只删除满足条件的行;并且不允许 LIMIT 和 WHERE 子句。DELETE 语句允许从不同数据库中的表中删除行,但不允许从表中删除,然后在子查询中从同一表中选择。

查看以下 DELETE 语法 −

DELETE FROM table_name [WHERE …]

从命令提示符或使用 PHP 脚本执行 DELETE 命令。

The Command Prompt

在命令提示符下,只需使用标准命令 −

root@host# mysql –u root –p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> DELETE FROM products_tbl WHERE product_id=133;
mysql> SELECT * from products_tbl WHERE ID_number='133';
ERROR 1032 (HY000): Can't find record in 'products_tbl'

PHP Delete Query Script

在 DELETE 命令语句中使用 mysql_query() 函数 −

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'DELETE FROM products_tbl WHERE product_id = 261';
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not delete data: ' . mysql_error());
   }

   echo "Deleted data successfully\n";
   mysql_close($conn);
?>

在成功删除数据后,您将看到以下输出 −

mysql> Deleted data successfully
mysql> SELECT * from products_tbl WHERE ID_number='261';
ERROR 1032 (HY000): Can't find record in 'products_tbl'

MariaDB - Like Clause

WHERE 子句提供了一种在操作使用完全匹配时检索数据的方式。在需要具有共享特征的多条结果的情况下, LIKE 子句可容纳广义模式匹配。

LIKE 子句测试模式匹配,返回真或假。用于比较的模式接受以下通配符:“%”,它与数字字符(0 或更多)匹配;而 “ ”, which matches a single character. The “ ” 通配符仅与它自己集合内的字符匹配,这意味着在使用另一个集合时它将忽略拉丁字符。默认情况不区分大小写,需要附加设置来区分大小写。

NOT LIKE 子句允许测试相反条件,很像 not 运算符。

如果语句表达式或模式评估为 NULL,则结果为 NULL。

复习以下给出的 LIKE 子句一般语法 −

SELECT field, field2,... FROM table_name, table_name2,...
WHERE field LIKE condition

在命令提示符处或 PHP 脚本中使用 LIKE 子句。

The Command Prompt

在命令提示符下,只需使用标准命令 −

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from products_tbl
   WHERE product_manufacturer LIKE 'XYZ%';
+-------------+----------------+----------------------+
| ID_number   | Nomenclature   | product_manufacturer |
+-------------+----------------+----------------------+
| 12345       | Orbitron 4000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12346       | Orbitron 3000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12347       | Orbitron 1000  | XYZ Corp             |
+-------------+----------------+----------------------+

PHP Script Using Like Clause

在使用 LIKE 子句的语句中使用 mysql_query() 函数

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date
      FROM products_tbl WHERE product_manufacturer LIKE "xyz%"';

   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID:{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date: {$row['ship_date']} <br> ".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

当数据检索成功时,您将看到以下输出 −

Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully

MariaDB - Order By Clause

如前文讨论所述, ORDER BY 子句对语句的结果进行排序。它指定所操作数据的顺序,并包括按升序 (ASC) 或降序 (DESC) 排序的选项。在忽略订单规范的情况下,默认订单为升序。

ORDER BY 子句出现在各种语句中,例如 DELETE 和 UPDATE。它们始终出现在语句的末尾,而不在子查询中或在集合函数之前,因为它们对最终结果表进行操作。您也不能使用整数来标识列。

复习以下给出的 ORDER BY 子句的一般语法 −

SELECT field, field2,... [or column] FROM table_name, table_name2,...
ORDER BY field, field2,... ASC[or DESC]

在命令提示符处或 PHP 脚本中使用 ORDER BY 子句。

The Command Prompt

在命令提示符下,只需使用标准命令 −

root@ host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed

mysql> SELECT * from products_tbl ORDER BY product_manufacturer ASC
+-------------+----------------+----------------------+
| ID_number   | Nomenclature   | product_manufacturer |
+-------------+----------------+----------------------+
| 56789       | SuperBlast 400 | LMN Corp             |
+-------------+----------------+----------------------+
| 67891       | Zoomzoom 5000  | QFT Corp             |
+-------------+----------------+----------------------+
| 12347       | Orbitron 1000  | XYZ Corp             |
+-------------+----------------+----------------------+

PHP Script Using Order By Clause

在使用 ORDER BY 子句的语句中再次使用 mysql_query() 函数 −

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date
      FROM products_tbl ORDER BY product_manufacturer DESC';

   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID :{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date : {$row['ship_date']} <br> ".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

当数据检索成功时,您将看到以下输出 −

Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 67891
Nomenclature: Zoomzoom 5000
Manufacturer: QFT Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 56789
Nomenclature: SuperBlast 400
Manufacturer: LMN Corp
Ship Date: 01/04/17
----------------------------------------------
mysql> Fetched data successfully

MariaDB - Join

在之前的讨论和示例中,我们从单表中进行检索,或从多源中检索多个值。大多数实际数据操作要复杂得多,需要从多张表中进行聚合、比较和检索。

JOINs 允许将两个或多个表合并为单个对象。它们通过 SELECT、UPDATE 和 DELETE 语句使用。

复习如下所示使用 JOIN 的语句的一般语法 −

SELECT column
FROM table_name1
INNER JOIN table_name2
ON table_name1.column = table_name2.column;

请注意,用于 JOIN 的旧语法使用隐式连接且没有关键字。可以使用 WHERE 子句实现连接,但关键字最适合可读性、可维护性和最佳实践。

JOIN 有多种形式,例如左连接、右连接或内连接。各种联接类型基于共享值或特征提供不同类型的聚合。

在命令提示符处或使用 PHP 脚本使用 JOIN。

The Command Prompt

在命令提示符处,只需使用标准语句 −

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed

mysql> SELECT products.ID_number, products.Nomenclature, inventory.inventory_ct
   FROM products
   INNER JOIN inventory
   ON products.ID_numbeer = inventory.ID_number;
+-------------+----------------+-----------------+
| ID_number   | Nomenclature   | Inventory Count |
+-------------+----------------+-----------------+
| 12345       | Orbitron 4000  | 150             |
+-------------+----------------+-----------------+
| 12346       | Orbitron 3000  | 200             |
+-------------+----------------+-----------------+
| 12347       | Orbitron 1000  | 0               |
+-------------+----------------+-----------------+

PHP Script Using JOIN

使用 mysql_query() 函数执行联接操作-

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT a.product_id, a.product_manufacturer, b.product_count
      FROM products_tbl a, pcount_tbl b
      WHERE a.product_manufacturer = b.product_manufacturer';

   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Manufacturer:{$row['product_manufacturer']} <br> ".
         "Count: {$row['product_count']} <br> ".
         "Product ID: {$row['product_id']} <br> ".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

当数据检索成功时,您将看到以下输出 −

ID Number: 12345
Nomenclature: Orbitron 4000
Inventory Count: 150
--------------------------------------
ID Number: 12346
Nomenclature: Orbitron 3000
Inventory Count: 200
--------------------------------------
ID Number: 12347
Nomenclature: Orbitron 1000
Inventory Count: 0
--------------------------------------
mysql> Fetched data successfully

MariaDB - Null Values

在处理 NULL 值时,记住它们是未知值。它们不是有效值,即空字符串或零。在表创建中,列规范允许设置它们以接受空值或拒绝空值。只需使用 NULL 或 NOT NULL 子句。这在缺少记录信息(如 ID 编号)的情况下有应用。

用户定义变量在明确赋值之前具有 NULL 值。存储例程参数和局部变量允许设置 NULL 值。当局部变量没有默认值时,它具有 NULL 值。

NULL 不区分大小写,并且具有以下别名 -

  1. UNKNOWN (a boolean value)

  2. \N

NULL Operators

标准比较运算符不能与 NULL 一起使用(例如 =、>、>=、⇐、< 或 !=),因为对 NULL 值的所有比较都返回 NULL,而不是 true 或 false。与 NULL 的比较或可能包含 NULL 的比较必须使用“<⇒”(NULL 安全)运算符。

其他可用的运算符有 -

  1. IS NULL - 它测试 NULL 值。

  2. IS NOT NULL - 它确认不存在 NULL 值。

  3. ISNULL - 在发现 NULL 值时返回 1,在没有 NULL 值时返回 0。

  4. COALESCE - 它返回列表中的第一个非 NULL 值,或者在没有非 NULL 值时返回 NULL 值。

Sorting NULL Values

在排序操作中,NULL 值具有最低的值,因此 DESC 顺序将 NULL 值放在底部。MariaDB 允许为 NULL 值设置更高的值。

有两种方法可以做到这一点,如下所示 -

SELECT column1 FROM product_tbl ORDER BY ISNULL(column1), column1;

另一种方法 -

SELECT column1 FROM product_tbl ORDER BY IF(column1 IS NULL, 0, 1), column1 DESC;

NULL Functions

当任何参数为 NULL 时,函数通常会输出 NULL。但是,有一些函数专门设计用于管理 NULL 值。它们是 -

  1. IFNULL() - 如果第一个表达式不为 NULL,则返回它。当它计算为 NULL 时,它返回第二个表达式。

  2. NULLIF() - 当比较的表达式相等时,它返回 NULL,如果不相等,它返回第一个表达式。

SUM 和 AVG 等函数会忽略 NULL 值。

Inserting NULL Values

在声明为 NOT NULL 的列中插入 NULL 值时,会发生错误。在默认 SQL 模式下,NOT NULL 列将改为基于数据类型插入默认值。

当字段为 TIMESTAMP、AUTO_INCREMENT 或虚拟列时,MariaDB 会以不同的方式管理 NULL 值。在 AUTO_INCREMENT 列中插入会导致序列中的下一个数字插入到它所在的位置。在 TIMESTAMP 字段中,MariaDB 会为此分配当前时间戳。在本教程的后面部分讨论的虚拟列中,会分配默认值。

唯一索引可以保存许多 NULL 值,但主键不能为 NULL。

NULL Values and the Alter Command

当您使用 ALTER 命令修改一列时,在没有 NULL 规范的情况下,MariaDB 会自动分配值。

MariaDB - Regular Expression

除了 LIKE 子句中可用的模式匹配外,MariaDB 通过 REGEXP 运算符提供基于正则表达式的匹配。该运算符根据给定的模式对字符串表达式执行模式匹配。

MariaDB 10.0.5 引入了 PCRE 正则表达式,这极大地增加了匹配范围,涉及递归模式、前瞻断言等领域。

查看下面给出的标准 REGEXP 运算符语法的用法 −

SELECT column FROM table_name WHERE column REGEXP '[PATTERN]';

如果模式匹配,REGEXP 返回 1;否则返回 0。

NOT REGEXP 形式的选项与之相反。MariaDB 还为 REGEXP 和 NOT REGEXP 提供了同义词 RLIKE 和 NOT RLIKE,这些同义词出于兼容性原因创建。

要比较的模式可以是文本字符串或诸如表列的其它内容。在字符串中,它使用 C 转义语法,因此对所有“\”字符进行加倍。REGEXP 也区分大小写,二进制字符串除外。

下面给出了可以使用的一个模式表 −

Sr.No

Pattern & Description

1

^ 它匹配字符串的开头。

2

$ 它匹配字符串的结尾。

3

. 它匹配单个字符。

4

[&#8230;&#8203;] 它匹配括号中的任何字符。

5

[^&#8230;&#8203;] 它匹配括号中未列出的任何字符。

6

*p1

p2

p3*它匹配任何模式。

7

它匹配前一个元素的 0 个或多个实例。

8

+ 它匹配前一个元素的 1 个或多个实例。

9

{n} 它匹配前一个元素的 n 个实例。

10

{m,n} 它匹配前一个元素的 m 到 n 个实例。

查看下面提供的模式匹配示例 −

以“pr”开头的产品 −

SELECT name FROM product_tbl WHERE name REGEXP '^pr';

以“na”结尾的产品 −

SELECT name FROM product_tbl WHERE name REGEXP 'na$';

以元音开头的产品 −

SELECT name FROM product_tbl WHERE name REGEXP '^[aeiou]';

MariaDB - Transactions

事务是连续的组操作。它们作为一个单一单元运行,并且在组内所有操作全部成功执行之前不会终止。组内只要有一个操作失败,整个事务就会失败,并且这不会对数据库产生任何影响。

事务符合 ACID(原子性、一致性、隔离性和耐久性)−

  1. Atomicity − 通过在发生故障时中止并回滚更改来确保所有操作成功。

  2. Consistency − 它确保数据库在事务成功后应用更改。

  3. Isolation − 它使事务能够独立操作。

  4. Durability − 它确保系统发生故障时成功的事务的持久性。

在事务语句的开头是 START TRANSACTION 语句,后面跟着 COMMIT 和 ROLLBACK 语句 −

  1. START TRANSACTION 开始事务。

  2. COMMIT 保存对数据所做的更改。

  3. ROLLBACK 结束事务,销毁所有更改。

在事务成功时,COMMIT 起作用。在失败时,ROLLBACK 起作用。

Note − 某些语句会导致隐式提交,当在事务内使用时,它们也会导致错误。此类语句的示例包括但不限于 CREATE、ALTER 和 DROP。

MariaDB 事务还包括 SAVEPOINT 和 LOCK TABLES 等选项。SAVEPOINT 设置一个还原点以用于 ROLLBACK。LOCK TABLES 可以在会话期间控制对表的访问,以防止在某些时间段内进行修改。

AUTOCOMMIT 变量提供对事务的控制。将其设置为 1 会强制所有操作都被视为成功事务,而将其设置为 0 则会导致只有在显式 COMMIT 语句中才会持久保留更改。

Structure of a Transaction

事务语句的一般结构包含从 START TRANSACTION 开始。下一步是插入一个或多个命令/操作,插入检查错误的语句,插入 ROLLBACK 语句以管理发现的任何错误,最后插入 COMMIT 语句以对成功操作应用更改。

查看下面给出的示例 −

START TRANSACTION;
SELECT name FROM products WHERE manufacturer = 'XYZ Corp';
UPDATE spring_products SET item = name;
COMMIT;

MariaDB - Alter Command

ALTER 命令提供了一种修改现有表结构的方法,它表示移除或添加列、修改索引、更改数据类型或更改名称等修改。当元数据锁处于活动状态时,ALTER 也会等待应用更改。

Using ALTER to Modify Columns

ALTER 与 DROP 结合使用,可以移除现有列。但是,如果该列是唯一剩余列,它将失败。

查看下面给出的示例 −

mysql> ALTER TABLE products_tbl DROP version_num;

使用 ALTER…​ADD 语句添加列 −

mysql> ALTER TABLE products_tbl ADD discontinued CHAR(1);

使用关键字 FIRST 和 AFTER 来指定列放置位置 −

ALTER TABLE products_tbl ADD discontinued CHAR(1) FIRST;
ALTER TABLE products_tbl ADD discontinued CHAR(1) AFTER quantity;

请注意,关键字 FIRST 和 AFTER 仅适用于 ALTER…​ADD 语句。此外,必须删除表,然后再添加表才能重新定位。

使用 ALTER 语句中的 MODIFY 或 CHANGE 子句来更改列定义或名称。这些子句具有类似效果,但使用完全不同的语法。

请查看以下给出的 CHANGE 示例 −

mysql> ALTER TABLE products_tbl CHANGE discontinued status CHAR(4);

在使用 CHANGE 的语句中,指定原始列,然后指定将替换它的新列。请查看以下 MODIFY 示例 −

mysql> ALTER TABLE products_tbl MODIFY discontinued CHAR(4);

ALTER 命令还允许更改默认值。请查看示例 −

mysql> ALTER TABLE products_tbl ALTER discontinued SET DEFAULT N;

还可以使用与 DROP 子句配对的方式删除默认约束 −

mysql> ALTER TABLE products_tbl ALTER discontinued DROP DEFAULT;

Using ALTER to Modify Tables

使用 TYPE 子句更改表类型 −

mysql> ALTER TABLE products_tbl TYPE = INNODB;

使用关键字 RENAME 重命名表 −

mysql> ALTER TABLE products_tbl RENAME TO products2016_tbl;

MariaDB - Indexes & Statistics Tables

索引是加速记录检索的工具。索引为索引列中的每个值生成一个条目。

有四种类型的索引 −

  1. Primary (一条记录表示所有记录)

  2. Unique (一条记录表示多个记录)

  3. Plain

  4. Full-Text (在文本搜索中允许许多选项)。

在这种用法中,术语 “键”和 “索引”是相同的。

索引与一列或多列关联,并支持快速搜索和高效的记录组织。在创建索引时,考虑在查询中经常使用的列。然后在这些列上创建一个或多个索引。此外,将索引视为主键表。

尽管索引加快搜索或 SELECT 语句,但它们会因为对表和索引执行操作而拖慢插入和更新速度。

Create an Index

可以通过 CREATE TABLE…​INDEX 语句或 CREATE INDEX 语句创建索引。支持可读性、维护性和最佳实践的最佳选项是 CREATE INDEX。

查看索引的一般语法,如下所示:

CREATE [UNIQUE or FULLTEXT or...] INDEX index_name ON table_name column;

查看其使用示例:

CREATE UNIQUE INDEX top_sellers ON products_tbl product;

Drop an Index

可以使用 DROP INDEX 或 ALTER TABLE…​DROP 删除索引。支持可读性、维护性和最佳实践的最佳选项是 DROP INDEX。

查看删除索引的一般语法,如下所示:

DROP INDEX index_name ON table_name;

查看其使用示例:

DROP INDEX top_sellers ON product_tbl;

Rename an Index

使用 ALTER TABLE 语句重命名索引。查看其给出的常用语法:

ALTER TABLE table_name DROP INDEX index_name, ADD INDEX new_index_name;

查看其使用示例:

ALTER TABLE products_tbl DROP INDEX top_sellers, ADD INDEX top_2016sellers;

Managing Indexes

您需要检查并跟踪所有索引。使用 SHOW INDEX 列出与给定表关联的所有现有索引。您可以通过使用诸如“\G”之类的选项来设置显示内容的格式,它指定垂直格式。

查看以下示例:

mysql > SHOW INDEX FROM products_tbl\G

Table Statistics

由于提供更快地访问记录和统计信息,索引被大量用于优化查询。然而,许多用户发现索引维护很繁琐。MariaDB 10.0 提供了与存储引擎无关的统计表,该表会计算每个存储引擎中每张表的统计信息,甚至会计算未被索引的列的统计信息。

MariaDB - Temporary Tables

一些操作可能会从临时表中受益,因为速度或可处置数据。无论您是否通过命令提示符、PHP 脚本或客户端程序使用临时表,临时表的生命都将终止于会话终止。它也不会以典型方式显示在系统中。SHOW TABLES 命令不会显示包含临时表的列表。

Create a Temporary Table

CREATE TABLE 语句中的 TEMPORARY 关键字生成一个临时表。查看下面给出的示例:

mysql>CREATE TEMPORARY TABLE order (
   item_name VARCHAR(50) NOT NULL
   , price DECIMAL(7,2) NOT NULL DEFAULT 0.00
   , quantity INT UNSIGNED NOT NULL DEFAULT 0
);

在创建临时表时,您可以克隆现有表,这意味着使用类似 LIKE 子句的所有常规特征。用于生成临时表的 CREATE TABLE 语句不会因 TEMPORARY 关键字而提交事务。

尽管临时表独立于非临时表并在会话结束时删除,但它们可能存在某些冲突:

  1. 它们有时会与已过期会话中的幽灵临时表发生冲突。

  2. 它们有时会与非临时表的影子名称发生冲突。

Note - 允许临时表与现有的非临时表具有相同的名称,因为 MariaDB 将其视为不同的引用。

Administration

MariaDB 要求向用户授予创建临时表的权限。利用 GRANT 语句向非管理员用户授予此权限。

GRANT CREATE TEMPORARY TABLES ON orders TO 'machine122'@'localhost';

Drop a Temporary Table

尽管临时表在会话结束时基本上会被删除,但您可以选择删除它们。删除临时表需要使用 TEMPORARY 关键字,并且最佳实践建议在任何非临时表之前删除临时表。

mysql> DROP TABLE order;

MariaDB - Table Cloning

有些情况下需要生成现有表的精确副本。CREATE…​SELECT 语句无法生成此输出,因为它忽略了诸如索引和默认值之类的内容。

复制表的步骤如下 −

  1. 利用 SHOW CREATE TABLE 生成 CREATE TABLE 语句来详细说明源表的整个结构。

  2. 编辑语句以向表提供一个新名称,然后执行它。

  3. 如果您还需要复制表数据,请使用 INSERT INTO…​SELECT 语句。

mysql> INSERT INTO inventory_copy_tbl (
   product_id,product_name,product_manufacturer,ship_date)

   SELECT product_id,product_name,product_manufacturer,ship_date,
   FROM inventory_tbl;

创建副本的另一种方法是使用 CREATE TABLE AS 语句。该语句复制所有列、列定义,并利用源表的数据填充副本。

查看其在下面提供的语法 −

CREATE TABLE clone_tbl AS
   SELECT columns
   FROM original_tbl
   WHERE conditions];

查看其在下面提供的示例用法 −

CREATE TABLE products_copy_tbl AS
   SELECT *
   FROM products_tbl;

MariaDB - Sequences

在版本 10.0.3 中,MariaDB 引入了一种名为序列的存储引擎。它的临时解决方案为操作生成一个整数序列,然后终止它。序列包含按降序或升序排列的正整数,并使用起始、结束和增量值。

由于其虚拟(未写入磁盘)性质,它不允许在多个查询中使用,只允许在其原始查询中使用。但是,可以通过 ALTER 命令将序列表转换为标准表。如果删除转换后的表,则序列表仍然存在。序列也不能产生负数或在最小值/最大值处旋转。

Installing the Sequence Engine

使用序列需要安装序列引擎,MariaDB 将其作为插件而不是二进制文件进行分发。使用以下命令安装它 −

INSTALL SONAME "ha_sequence";

安装后,验证它 −

SHOW ENGINES\G

请记住,在安装引擎后,您无法使用序列语法创建名称为标准表的表,但您可以创建带有序列语法名称的临时表。

Creating Sequence

有两种序列创建方法 −

  1. 创建一个表并使用 AUTO_INCREMENT 属性将一列定义为自动增量。

  2. 使用现有数据库并使用一个序列 SELECT 查询生成一个序列。查询使用 seq_ [FROM] to [TO] 或 seq_[FROM] to [TO]_step_STEP 语法。

最佳做法更偏好使用第二种方法。查看下面提供的一个序列创建示例 −

SELECT * FROM seq_77_to_99;

序列有许多用途 −

  1. 在列中找到丢失的值,以防止在操作中出现相关问题 −

SELECT myseq.seq FROM seq_22_to_28 myseq LEFT JOIN table1 t ON myseq.seq
   = x.y WHERE x.y IS NULL;
  1. 构造值组合 -

SELECT x1.seq, x2.seq FROM seq_5_to_9 x1 JOIN seq_5_to_9 x2 ORDER BY 5, 6;
  1. 查找数字倍数 -

SELECT seq FROM seq_3_to_100_step_4;
  1. 构造日期序列以在类似于预订系统的应用程序中使用。

  2. Construct a time sequence.

MariaDB - Managing Duplicates

如前文所讨论的,MariaDB 在某些情况下允许重复记录和表。由于不同的数据或对象类型,或者由于操作对象的独特寿命或存储,其中一些重复实际上并不是重复的。这些重复通常也不会有问题。

在某些情况下,重复确实会造成问题,并且它们经常是由隐式操作或 MariaDB 命令的宽松策略引起的。有方法可以控制此问题,查找重复项,删除重复项并阻止创建重复项。

Strategies and Tools

有四种关键方法可以管理重复项 -

  1. 使用 JOIN 找出它们,然后使用临时表删除它们。

  2. 在发现重复项时使用 INSERT…​ON DUPLICATE KEY UPDATE 进行更新。

  3. 使用 DISTINCT 修剪 SELECT 语句的结果并删除重复项。

  4. 使用 INSERT IGNORE 停止插入重复项。

Using Join with a Temporary Table

只需执行类似于内联连接的半连接,然后使用临时表删除找到的重复项。

Using INSERT

当 INSERT…​ON DUPLICATE KEY UPDATE 发现重复唯一或主键时,它会执行更新。当发现多个唯一键时,它只会更新第一个键。因此,不要在具有多个唯一索引的表上使用它。

复习以下示例,它揭示了在向已填入字段中插入索引值时表中发生的情况 -

INSERT INTO add_dupl VALUES (1,'Apple');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

Note - 如果它找不到键,则 INSERT…​ON DUPLICATE KEY UPDATE 语句将像普通插入语句一样执行。

Using DISTINCT

DISTINCT 子句从结果中删除重复项。DISTINCT 子句的一般语法如下 -

SELECT DISTINCT fields
FROM table
[WHERE conditions];

Note - 带有 DISTINCT 子句的语句的结果 -

  1. 当使用一个表达式时,它将返回该表达式的唯一值。

  2. 当使用多个表达式时,它将返回唯一组合。

  3. 它不会忽略 NULL 值;因此,结果也包含 NULL 值作为唯一值。

使用 DISTINT 从句对单一表达式查看以下语句 -

SELECT DISTINCT product_id
FROM products
WHERE product_name = 'DustBlaster 5000';

使用多个表达式查看以下示例 -

SELECT DISTINCT product_name, product_id
FROM products
WHERE product_id < 30

Using INSERT IGNORE

ON DUPLICATE KEY IGNORE 语句指示 MariaDB 在发现重复记录时取消插入。查看下面给出的示例 -

mysql> INSERT IGNORE INTO customer_tbl (LN, FN)
   VALUES( 'Lex', 'Luther');

同样,注意重复背后的逻辑。某些表基于该表数据的特性需要重复记录。在管理重复记录的策略中满足该需求。

MariaDB - SQL Injection Protection

接受用户输入这一简单的行为为利用者打开了方便之门。该问题主要源于对数据的逻辑管理,但幸运的是,避免这些主要缺陷相当容易。

SQL 注入的机会通常出现在用户输入名称等数据时,而代码逻辑无法分析此输入时。代码允许攻击者插入 MariaDB 语句,该语句将在数据库上运行。

总是考虑由用户输入的数据,它们可能是可疑的,并且在任何处理之前都需要进行强有力的验证。通过模式匹配执行此验证。例如,如果期望的输入是用户名,请将输入的字符限制为字母数字字符和下划线以及一定的长度。查看下面给出的示例 -

if(check_match("/^\w{8,20}$/", $_GET['user_name'], $matches)) {
   $result = mysql_query("SELECT * FROM system_users WHERE user_name = $matches[0]");
} else {
   echo "Invalid username";
}

同样,在创建输入约束时利用 REGEXP 运算符和 LIKE 从句。

考虑所有类型对输入的必要显性控制,例如 -

  1. 控制使用的转义字符。

  2. 控制输入的特定适当数据类型。将输入限制为必要的数据类型和大小。

  3. 控制输入数据的语法。不允许超出所需模式的任何内容。

  4. 控制允许的术语。将 SQL 关键字列入黑名单。

您可能不知道注入攻击的危险,或者认为它们无关紧要,但它们位居安全问题之首。此外,考虑以下两个条目的效果 -

1=1
-or-
*

允许其中任何一个与正确命令一起输入的代码可能会导致揭示数据库上的所有用户数据或删除数据库上的所有数据,并且两种注入都不是特别聪明。在某些情况下,攻击者甚至不需要花时间检查漏洞;他们只需使用简单的输入执行盲目攻击。

同样,考虑任何编程/脚本语言(与 MariaDB 配对)提供的模式匹配和正则表达式工具,它们提供了更多的控制,有时会提供更好的控制。

MariaDB - Backup Methods

数据是业务和运营的基础,由于存在各种可能的威胁(例如攻击者、系统故障、不良升级和维护错误),因此备份仍然至关重要。这些备份形式多样,并且有许多选项可以创建它们,并在这些过程中有更广泛的选项集。需要记住的重要事项是数据库类型、关键信息和所涉及的结构。这些信息决定了您的最佳选择。

OPTIONS

备份的主要选项包括逻辑备份和物理备份。逻辑备份保存 SQL 语句以恢复数据。物理备份包含数据的副本。

  1. 与通常仅限于同一台机器和数据库类型的物理备份相比,逻辑备份提供了在配置不同的另一台机器上恢复数据灵活性。逻辑备份发生在数据库和表级别,物理备份发生在目录和文件级别。

  2. Physical backups 大小比逻辑小,执行和恢复也花的时间更少。物理备份还包括日志和配置文件,但逻辑备份不包括。

Backup Tools

用于 MariaDB 备份的主要工具是 mysqldump 。它提供逻辑备份和灵活性。它还被证明是小型数据库的绝佳选择。 Mysqldump 将数据转储到 SQL、CSV、XML 和其他许多格式中。在没有明确指令的情况下,其输出不会保留存储过程、视图和事件。

有三个用于 mysqldump 备份的选项 −

  1. Raw data − 通过 --tab 选项将表转储为原始数据文件,该选项还指定文件的目标 −

$ mysqldump -u root -p --no-create-info \
   --tab=/tmp PRODUCTS products_tbl
  1. Data/Definitions export − 此选项允许将单个或多个表导出到文件中,并支持备份主机上的所有现有数据库。查看将内容或定义导出到文件的一个示例

$ mysqldump -u root -p PRODUCTS products_tbl > export_file.txt
  1. Transfer − 您还可以将数据库和表输出到另一个主机

$ mysqldump -u root -p database_name \
   | mysql -h other-host.com database_name

Using THE SELECT…​INTO OUTFILE Statement

导出数据的另一个选项采用 SELECT…​INTO OUTFILE 语句。此简单选项将表输出到一个简单的格式化文本文件中 −

mysql> SELECT * FROM products_tbl
   -> INTO OUTFILE '/tmp/products.txt';

其属性允许您根据自己的首选规范设置文件格式。

请注意此语句的以下特性 −

  1. 文件名必须指定您希望输出的目标位置。

  2. 您需要 MariaDB 文件权限才能执行此语句。

  3. 输出文件名必须是唯一的。

  4. 您需要主机的登录凭据。

  5. 在 UNIX 环境中,输出文件是世界可读的,但其服务器所有权会影响您删除它的能力。确保您有权限。

Using CONNECT in Backups

CONNECT 处理程序允许导出数据。当 SELECT…​INTO OUTFILE 操作不支持文件格式时,这主要在情况下很有用。

查看以下示例:

create table products
engine = CONNECT table_type = XML file_name = 'products.htm' header = yes
option_list = 'name = TABLE,coltype = HTML,attribute = border = 1;cellpadding = 5'

select plugin_name handler, plugin_version version, plugin_author
author, plugin_description description, plugin_maturity maturity
from information_schema.plugins where plugin_type = 'STORAGE ENGINE';

Other Tools

其他备份选项如下 −

  1. XtraBackup − 此选项针对 XtraDB/InnoDB 数据库,并且适用于任何存储引擎。从 Percona 的官方网站了解更多有关此工具的信息。

  2. Snapshots − 某些文件系统允许快照。此过程包括使用读锁刷新表、挂载快照、解锁表、复制快照,然后卸载快照。

  3. LVM − 此流行方法使用 Perl 脚本。它对每个表获取读锁并将高速缓存刷新到磁盘。然后,它获取快照并解锁表。请参阅官方 mylvmbackup 网站了解更多信息。

  4. TokuBackup − Percona 提供的此解决方案提供了热备份,同时考虑了 InnoDB 备份选项的问题和限制。它生成文件的可事务健全副本,同时应用程序继续操控这些文件。有关更多信息,请查看 Percona 网站。

INNODB Considerations

InnoDB 使用缓冲池来提高性能。在备份中,配置 InnoDB 以避免将整个表复制到缓冲池,因为逻辑备份通常执行全表扫描。

MariaDB - Backup Loading Methods

在本章中,我们将了解各种备份加载方法。从备份还原数据库是一个简单但有时非常漫长的过程。

加载数据有三种选择:LOAD DATA 语句、mysqlimport 和简单的 mysqldump 还原。

Using LOAD DATA

LOAD DATA 语句用作批量加载器。查看其中加载文本文件的用例示例 −

mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl;

注意 LOAD DATA 语句的以下特点 −

  1. 使用 LOCAL 关键字以防止 MariaDB 对主机执行深度搜索,并使用非常具体的路径。

  2. 该语句假定格式由换行符(换行符)终止的行和由制表符分隔的数据值组成。

  3. 使用 FIELDS 子句显式指定一行中域的格式。使用 LINES 子句指定行结尾。查看下面的示例。

mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl
   FIELDS TERMINATED BY '|'
   LINES TERMINATED BY '\n';
  1. 此语句假定数据文件中的列使用与表相同的顺序。如果您需要设置不同的顺序,则可以按如下方式加载文件 −

mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl (c, b, a);

Using MYSQLIMPORT

mysqlimport 工具充当一个 LOAD DATA 封装器,允许从命令行执行相同的操作。

按如下方式加载数据 −

$ mysqlimport -u root -p --local database_name source_file.txt

按如下方式指定格式 −

$ mysqlimport -u root -p --local --fields-terminated-by="|" \
   --lines-terminated-by="\n" database_name source_file.txt

使用 — columns 选项指定列顺序 −

$ mysqlimport -u root -p --local --columns=c,b,a \
   database_name source_file.txt

Using MYSQLDUMP

使用 mysqldump 还原需要此简单语句将转储文件加载回主机 −

shell> mysql database_name < source_file.sql

SPECIAL CHARACTERS AND QUOTES

在 LOAD DATA 语句中,可能无法正确解释引号和特殊字符。该语句假定未加引号的值,并将反斜杠视为转义字符。使用 FIELDS 子句指定格式。用“ENCLOSED BY”指向引号,这会导致从数据值中剥离引号。用“ESCAPED BY”更改转义。

MariaDB - Useful Functions

本章包含一个最常用函数列表,提供了定义、说明和示例。

MariaDB Aggregate Functions

最常用的聚合函数如下 −

Sr.No

Name & Description

1

COUNT 它计算记录数。 Example − SELECT COUNT(*) FROM customer_table;

2

MIN 显示一组记录的最小值。 Example − SELECT organization, MIN(account) FROM contracts GROUP BY organization;

3

MAX 显示一组记录的最大值。 Example − SELECT organization, MAX(account_size) FROM contracts GROUP BY organization;

4

AVG 计算一组记录的平均值。 Example − SELECT AVG(account_size) FROM contracts;

5

SUM 计算一组记录的总和。 Example − SELECT SUM(account_size) FROM contracts;

MariaDB Age Calculation

TIMESTAMPDIFF 函数可用来计算年龄 −

SELECT CURDATE() AS today;
SELECT ID, DOB, TIMESTAMPDIFF(YEAR,DOB,'2015-07-01') AS age FROM officer_info;

MariaDB String Concatenation

CONCAT 函数连接操作后的返回结果字符串。您可以利用一个或多个参数。查看其给出的语法 −

SELECT CONCAT(item, item,...);

查看以下示例:

SELECT CONCAT('Ram', 'bu', 'tan');
Output:Rambutan

MariaDB Date/Time Functions

以下是重要的日期函数 −

Sr.No

Name & Description

1

CURDATE() 以 yyyy-mm-dd 或 yyyymmdd 格式返回日期。 Example − SELECT CURDATE();

2

DATE() 以多种格式返回日期。 Example −CREATE TABLE product_release_tbl (x DATE);

3

CURTIME() 以 HH:MM:SS 或 HHMMSS.uuuuuu 格式返回时间。 Example − SELECT CURTIME();

4

DATE_SUB() 从指定日期加减天数。 Example − SELECT DATE_SUB('2016-02-08', INTERVAL 60 DAY);

5

DATEDIFF() 确定两个日期之间的天数。 Example − SELECT DATEDIFF('2016-01-01 23:59:59','2016-01-03');

6

DATE ADD() 在日期和时间加减任何时间单位。 Example − SELECT DATE_ADD('2016-01-04 23:59:59', INTERVAL 22 SECOND);

7

EXTRACT() 从日期中提取一个单位。 Example − SELECT EXTRACT(YEAR FROM '2016-01-08');

8

NOW() 以 yyyy-mm-dd hh:mm:ss 或 yyyymmddhhmmss.uuuuuu 格式返回当前日期和时间。 Example − SELECT NOW();

9

DATE FORMAT() 根据指定格式字符串格式化日期。 Example − SELECT DATE_FORMAT('2016-01-09 20:20:00', '%W %M %Y');

以下是部分重要的时间函数 −

Sr.No

Name & Description

1

HOUR() 返回时间的小时数或经过的小时数。 Example − SELECT HOUR('19:17:09');

2

LOCALTIME() 功能同 NOW()。

3

MICROSECOND() 它返回时间微秒数。 Example − SELECT MICROSECOND('16:30:00.543876');

4

MINUTE() 它返回时间分钟数。 Example − SELECT MINUTE('2016-05-22 17:22:01');

5

SECOND() 它返回日期秒数。 Example − SELECT SECOND('2016-03-12 16:30:04.000001');

6

TIME_FORMAT() 根据指定格式字符串格式化时间。 Example − SELECT TIME_FORMAT('22:02:20', '%H %k %h %I %l');

7

TIMESTAMP() 它提供 yyyy-mm-dd hh:mm:dd 格式的活动时间戳。 Example − CREATE TABLE orders_ (ID INT, tmst TIMESTAMP);

MariaDB Numeric Functions

下面是 MariaDB 中一些重要的数值函数−

Sr.No

Name & Description

1

TRUNCATE() 它返回截断后到小数位数指定的位置的数字。 Example − SELECT TRUNCATE(101.222, 1);

2

COS() 它返回 x 弧度的余弦。 Example − SELECT COS(PI());

3

CEILING() 它返回不低于 x 的最小整数。 Example − SELECT CEILING(2.11);

4

DEGREES() 将弧度转化为角度。 Example − SELECT DEGREES(PI());

5

DIV() 执行除法取整。 Example − SELECT 100 DIV 4;

6

EXP() 它返回 x 的 e 次方。 Example − SELECT EXP(2);

7

FLOOR() 它返回不大于 x 的最大整数。 Example − SELECT FLOOR(2.01);

8

LN() 返回 x 的自然对数。 Example − SELECT LN(3);

9

LOG() 它返回自然对数或给定底数的对数。 Example − SELECT LOG(3);

10

SQRT() 它返回平方根。 Example − SELECT SQRT(16);

MariaDB String Functions

下面列出一些重要的字符串函数−

Sr.No

Name & Description

1

INSTR() 返回子字符串的第一个实例的位置。 Example − SELECT INSTR('rambutan', 'tan');

2

RIGHT() 它返回最右边的字符串字符。 Example − SELECT RIGHT('rambutan', 3);

3

LENGTH() 它返回一个字符串的字节长度。 Example − SELECT LENGTH('rambutan');

4

LOCATE() 它返回子字符串第一次出现的位置。 Example − SELECT LOCATE('tan', 'rambutan');

5

INSERT() 它返回一个字符串,其中在特定位置处的指定子字符串已被修改。 Example − SELECT INSERT('ramputan', 4, 1, 'b');

6

LEFT() 它返回最左边的字符。 Example − SELECT LEFT('rambutan', 3);

7

UPPER() 它将字符更改为大写。 Example − SELECT UPPER(lastname);

8

LOWER() 它将字符更改为小写。 Example − SELECT LOWER(lastname);

9

STRCMP() 它比较字符串并在它们相等时返回 0。 Example − SELECT STRCMP('egg', 'cheese');

10

REPLACE() 它在替换字符后返回字符串。 Example − SELECT REPLACE('sully', 'l', 'n');

11

REVERSE() 它反转字符串中的字符。 Example − SELECT REVERSE('racecar');

12

REPEAT() 它多次重复给定字符。 Example − SELECT REPEAT('ha ', 10);

13

SUBSTRING() 它从字符串中返回从位置 x 开始的子字符串。 Example − SELECT SUBSTRING('rambutan',3);

14

TRIM() 它删除字符串结尾/开头的字符。 Example − SELECT TRIM(LEADING '_' FROM '_rambutan');