MariaDB 快速指南



MariaDB - 简介

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

数据库也使用非关系型数据源,例如对象或文件。但是,对于大型数据集,数据库是最佳选择,而其他数据源在检索和写入方面速度较慢。

关系数据库管理系统 (RDBMS) 将数据存储在各种表中。这些表之间的关系是使用主键和外键建立的。

RDBMS 提供以下功能:

  • 它们使您可以实现具有表、列和索引的数据源。

  • 它们确保跨多个表的行的引用完整性。

  • 它们自动更新索引。

  • 它们解释 SQL 查询和操作,以操作或从表中获取数据。

RDBMS 术语

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

  • 数据库 - 数据库是由包含相关数据的表组成的数据源。

  • - 表(即电子表格)是一个包含数据的矩阵。

  • - 列(即数据元素)是一个保存一种类型数据的结构;例如,发货日期。

  • - 行是一个对相关数据进行分组的结构;例如,客户的数据。它也称为元组、条目或记录。

  • 冗余 - 此术语是指为了加速系统而将数据存储两次。

  • 主键 - 这是指一个唯一标识值。此值不能在表中出现两次,并且只有一个行与之关联。

  • 外键 - 外键用作两个表之间的链接。

  • 复合键 - 复合键或组合键是指多个列的键。由于列缺乏唯一性,因此它指的是多个列。

  • 索引 - 索引实际上与书籍的索引相同。

  • 参照完整性 - 此术语是指确保所有外键值都指向现有行。

MariaDB 数据库

MariaDB 是 MySQL 的一个流行分支,由 MySQL 的原始开发者创建。它源于对 Oracle 收购 MySQL 的担忧。它同时支持小型数据处理任务和企业需求。其目标是成为 MySQL 的直接替代品,只需简单地卸载 MySQL 并安装 MariaDB 即可。MariaDB 提供了与 MySQL 相同的功能,甚至更多。

MariaDB 的主要功能

MariaDB 的重要功能包括:

  • 所有 MariaDB 都在 GPL、LGPL 或 BSD 下。

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

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

  • MariaDB 运行在许多操作系统上,并支持各种编程语言。

  • MariaDB 支持 PHP,这是最流行的 Web 开发语言之一。

  • MariaDB 提供 Galera 集群技术。

  • MariaDB 还提供了许多 MySQL 中没有的操作和命令,并消除了/替换了会对性能产生负面影响的功能。

入门

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

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

如果您缺乏熟悉度或需要复习,我们强烈建议您回顾我们的 PHP 教程。

MariaDB - 安装

MariaDB 的所有下载都位于 MariaDB 基金会官方网站的 下载 部分。点击您想要的版本链接,将会显示多个操作系统、架构和安装文件类型的下载列表。

在 LINUX/UNIX 上安装

如果您精通 Linux/Unix 系统,只需下载源代码即可构建您的安装程序。我们推荐的安装方法是使用发行版软件包。MariaDB 为以下 Linux/Unix 发行版提供软件包:

  • RedHat/CentOS/Fedora
  • Debian/Ubuntu

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

  • openSUSE
  • Arch Linux
  • Mageia
  • Mint
  • Slackware

按照以下步骤在 Ubuntu 环境中安装:

步骤 1 - 以 root 用户身份登录。

步骤 2 - 导航到包含 MariaDB 软件包的目录。

步骤 3 - 使用以下代码导入 GnuPG 签名密钥:

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

步骤 4 - 将 MariaDB 添加到 sources.list 文件。打开文件,并添加以下代码:

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

步骤 5 - 使用以下命令刷新系统:

sudo apt-get update

步骤 6 - 使用以下命令安装 MariaDB:

sudo apt-get install mariadb-server

在 Windows 上安装

找到并下载自动化安装文件 (MSI) 后,只需双击该文件即可启动安装。安装向导将引导您完成安装的每个步骤以及任何必要的设置。

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

mysqld.exe --console

如果安装成功,您将看到与启动相关的消息。如果没有看到此输出,您可能存在权限问题。确保您的用户帐户可以访问该应用程序。Windows 环境中提供了用于 MariaDB 管理的图形客户端。如果您觉得命令行不方便或麻烦,请务必尝试一下。

测试安装

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

使用管理实用程序获取服务器状态

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

[root@host]# mysqladmin --version

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

使用客户端执行简单命令

启动 MariaDB 的命令提示符。这应该将您连接到 MariaDB 并允许执行命令。输入一个简单的命令,如下所示:

mysql> SHOW DATABASES;

安装后

成功安装 MariaDB 后,设置 root 密码。新安装的密码将为空。输入以下命令来设置新密码:

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

输入以下命令使用您的新凭据连接到服务器:

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

在 Windows 上升级

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

MySQL my.cnf 文件的选项应该适用于 MariaDB。但是,MariaDB 具有许多在 MySQL 中找不到的功能。

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

  • MariaDB 默认情况下使用 Aria 存储引擎用于临时文件。如果您有很多临时文件,如果您不使用 MyISAM 表,请修改 key buffer size。

  • 如果您的应用程序频繁连接/断开连接,请更改线程缓存大小。

  • 如果您使用超过 100 个连接,请使用线程池。

兼容性

MySQL 和 MariaDB 本质上是相同的。但是,存在足够的差异会导致升级问题。在 MariaDB 知识库 中查看更多这些关键差异。

MariaDB - 管理

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

  • 运行 mysqld(MariaDB 二进制文件)。
  • 运行 mysqld_safe 启动脚本。
  • 运行 mysql.server 启动脚本。

如果您在非标准位置安装了 MariaDB,则可能需要编辑脚本文件中的位置信息。只需在脚本中添加“stop”参数即可停止 MariaDB。

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

创建用户帐户

使用以下代码创建一个新的用户帐户:

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

此代码向用户表添加一行,没有任何权限。您还可以选择使用哈希值作为密码。使用以下代码授予用户权限:

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

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

配置文件

在 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

如果您已将 datadir 添加到配置文件中,请省略“$PWD”变量。运行 MariaDB 10.0.1 版本时,请确保使用“$LOGNAME”。

管理命令

查看以下列表,其中包含使用 MariaDB 时经常使用的重要命令:

  • USE [数据库名称] − 设置当前默认数据库。

  • SHOW DATABASES − 列出服务器上当前存在的数据库。

  • SHOW TABLES − 列出所有非临时表。

  • SHOW COLUMNS FROM [表名称] − 提供指定表的列信息。

  • SHOW INDEX FROM TABLENAME [表名称] − 提供指定表的索引信息。

  • SHOW TABLE STATUS LIKE [表名称]\G – − 提供非临时表的信息,LIKE 子句后的模式用于获取表名。

MariaDB - PHP 语法

MariaDB 与多种编程语言和框架兼容,例如 PHP、C#、JavaScript、Ruby on Rails、Django 等。由于其简单性和历史积累,PHP 仍然是最流行的语言之一。本指南将重点介绍 PHP 与 MariaDB 的结合使用。

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 - 连接

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

MYSQL 二进制文件

查看以下示例。

[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 连接脚本

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

语法

查看以下 PHP 连接脚本语法:

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

参数描述如下:

序号 参数及描述
1

服务器

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

2

用户

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

3

密码

此可选参数指定用户的密码。其默认值为为空。

4

新链接

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

5

客户端标志

此可选参数使用以下常量值的组合:

  • 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 - 创建数据库

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

mysqladmin 二进制文件

以下示例演示如何使用 mysqladmin 二进制文件创建一个名为Products 的数据库:

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

PHP 创建数据库脚本

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

语法

查看以下创建数据库脚本语法:

bool mysql_query( sql, connection );

参数描述如下:

序号 参数及描述
1

sql

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

2

连接

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

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

<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 - 删除数据库

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

请注意,删除的数据库无法恢复,因此在执行此操作时请谨慎操作。此外,用于删除的 PHP 脚本在删除之前不会提示您确认。

mysqladmin 二进制文件

以下示例演示如何使用 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 删除数据库脚本

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

语法

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

bool mysql_query( sql, connection );

参数描述如下:

序号 参数及描述
1

sql

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

2

连接

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

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

<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 - 选择数据库

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

命令提示符

在命令提示符下选择数据库时,只需使用 SQL 命令‘use’

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

Enter password:******

mysql> use PRODUCTS;

Database changed

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

选择数据库后,所有后续命令都将作用于所选数据库。

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

PHP 选择数据库脚本

PHP 提供了mysql_select_db 函数用于选择数据库。该函数使用两个参数,一个可选,成功选择时返回“true”,失败时返回 false。

语法

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

bool mysql_select_db( db_name, connection );

参数描述如下:

序号 参数及描述
1

数据库名称

此必需参数指定要使用的数据库的名称。

2

连接

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

尝试以下示例代码来选择数据库:

<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 - 数据类型

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

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

数值数据类型

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

  • TINYINT − 此数据类型表示介于 -128 到 127(有符号)和 0 到 255(无符号)之间的小整数。

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

  • SMALLINT − 此数据类型表示介于 -32768 到 32768(有符号)和 0 到 65535(无符号)之间的整数。

  • MEDIUMINT − 此数据类型表示介于 -8388608 到 8388607(有符号)和 0 到 16777215(无符号)之间的整数。

  • INT(也称 INTEGER) − 此数据类型表示普通大小的整数。如果标记为无符号,则范围为 0 到 4294967295。如果是有符号的(默认设置),则范围为 -2147483648 到 2147483647。如果将列设置为 ZEROFILL(无符号状态),则其所有值前面都会加上零,以使 INT 值达到 M 位数字。

  • BIGINT − 此数据类型表示介于 -9223372036854775808 到 9223372036854775807(有符号)和 0 到 18446744073709551615(无符号)之间的整数。

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

  • FLOAT − 此数据类型表示值为 0 或在以下范围内的较小的浮点数:

    • -3.402823466E+38 到 -1.175494351E-38

    • 1.175494351E-38 到 3.402823466E+38

  • DOUBLE(也称REALDOUBLE PRECISION)− 此数据类型表示值为 0 或在以下范围内的普通大小的浮点数:

    • -1.7976931348623157E+308 到 -2.2250738585072014E-308

    • 2.2250738585072014E-308 到 1.7976931348623157E+308

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

日期和时间数据类型

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

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

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

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

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

  • YEAR − 此数据类型表示 4 位数字格式的年份。四位数字格式允许的值范围为 1901 到 2155,以及 0000。

字符串数据类型

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

  • 字符串字面量 − 此数据类型表示用引号括起来的字符序列。

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

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

  • BINARY − 此数据类型表示二进制字节字符串,M 为以字节为单位的列长度。

  • VARBINARY − 此数据类型表示可变长度的二进制字节字符串,M 为列长度。

  • TINYBLOB − 此数据类型表示最大长度为 255(28 - 1)字节的 blob 列。在存储中,每个都使用一个字节的长度前缀来指示值中的字节数量。

  • BLOB − 此数据类型表示最大长度为 65,535(216 - 1)字节的 blob 列。在存储中,每个都使用一个两字节的长度前缀来指示值中的字节数量。

  • MEDIUMBLOB − 此数据类型表示最大长度为 16,777,215 (224 - 1) 字节的 Blob 列。在存储中,每个值都使用一个三字节长度前缀来指示值的字节数量。

  • LONGBLOB − 此数据类型表示最大长度为 4,294,967,295 (232 - 1) 字节的 Blob 列。在存储中,每个值都使用一个四字节长度前缀来指示值的字节数量。

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

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

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

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

  • ENUM − 此数据类型表示一个字符串对象,它只有一个来自列表的值。

  • SET − 此数据类型表示一个字符串对象,它具有来自列表的零个或多个值,最多 64 个成员。SET 值在内部表示为整数值。

MariaDB - 创建表

本章将学习如何创建表。在创建表之前,首先确定其名称、字段名称和字段定义。

以下是创建表的通用语法:

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 将列定义为主键。多个用逗号分隔的列可以定义主键。

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

命令提示符

使用 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 创建表脚本

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 TABLE table_name ;

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

命令提示符

在命令提示符下,只需使用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 删除表脚本

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 查询

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

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

查看下面给出的通用语法:

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

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

注意 − 语句中出现的 VALUES() 函数仅适用于 INSERT 语句,如果在其他地方使用则返回 NULL。

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

命令提示符

在提示符下,有多种方法可以执行选择操作。下面给出一个标准语句:

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 插入脚本

在 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 查询

本章将学习如何从表中选择数据。

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

查看以下通用语法:

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

SELECT 语句提供了多种指定所用表的选项:

  • database_name.table_name

  • table_name.column_name

  • database_name.table_name.column_name

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

  • 列名。

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

  • 规范“table_name.*”用于选择给定表中的所有列。

  • 字符“*”用于从 FROM 子句中指定的所有表中选择所有列。

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

命令提示符

在命令提示符下,按如下方式执行语句:

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 选择脚本

在 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 子句

WHERE 子句过滤各种语句,例如 SELECT、UPDATE、DELETE 和 INSERT。它们提供用于指定操作的条件。它们通常出现在语句中的表名之后,其条件紧随其后。WHERE 子句实际上起着 if 语句的作用。

查看下面给出的 WHERE 子句的通用语法:

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

请注意 WHERE 子句的以下特性:

  • 它是可选的。

  • 它允许指定任何条件。

  • 它允许通过使用 AND 或 OR 运算符来指定多个条件。

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

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

运算符
= !=
> <
>= <=

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

命令提示符

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

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');

使用 WHERE 子句的 PHP 脚本

在使用 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 查询

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

查看以下通用语法:

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

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

命令提示符

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

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 命令语句中使用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 查询

DELETE 命令删除指定表中的表行,并返回已删除的数量。使用 ROW_COUNT() 函数访问已删除的数量。WHERE 子句指定行,如果不存在,则删除所有行。LIMIT 子句控制已删除的行数。

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

查看以下 DELETE 语法:

DELETE FROM table_name [WHERE …]

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

命令提示符

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

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 命令语句中使用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 子句

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

LIKE 子句测试模式匹配,返回 true 或 false。用于比较的模式接受以下通配符字符:“%”,它匹配多个字符(0 个或多个);和“_”,它匹配单个字符。“_”通配符仅匹配其集合中的字符,这意味着在使用另一个集合时它将忽略拉丁字符。默认情况下,匹配不区分大小写,需要其他设置才能区分大小写。

NOT LIKE 子句允许测试相反的条件,就像not运算符一样。

如果语句表达式或模式计算结果为 NULL,则结果为 NULL。

查看下面给出的通用 LIKE 子句语法:

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

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

命令提示符

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

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             |
+-------------+----------------+----------------------+

使用 LIKE 子句的 PHP 脚本

在使用 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 子句

如前所述,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 子句。

命令提示符

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

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             |
+-------------+----------------+----------------------+

使用 ORDER BY 子句的 PHP 脚本

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

<?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

在之前的讨论和示例中,我们研究了从单个表中检索数据,或者从多个来源检索多个值。大多数现实世界中的数据操作要复杂得多,需要聚合、比较和从多个表中检索数据。

JOIN(连接)允许将两个或多个表合并成一个单一的对象。它们通过 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。

命令提示符

在命令提示符下,只需使用标准语句:

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               |
+-------------+----------------+-----------------+

使用 JOIN 的 PHP 脚本

使用 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 值

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

用户定义变量的值为 NULL,直到显式赋值。存储例程参数和局部变量允许设置 NULL 值。当局部变量没有默认值时,它的值为 NULL。

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

  • UNKNOWN(布尔值)
  • \N

NULL 运算符

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

其他可用运算符包括:

  • IS NULL — 测试 NULL 值。

  • IS NOT NULL — 确认不存在 NULL 值。

  • ISNULL — 在发现 NULL 值时返回 1,在不存在 NULL 值时返回 0。

  • COALESCE — 返回列表中的第一个非 NULL 值,或者在不存在非 NULL 值时返回 NULL 值。

排序 NULL 值

在排序操作中,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 函数

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

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

  • NULLIF() — 当比较的表达式相等时,它返回 NULL;如果不相等,则返回第一个表达式。

SUM 和 AVG 等函数忽略 NULL 值。

插入 NULL 值

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

当字段是 TIMESTAMP、AUTO_INCREMENT 或虚拟列时,MariaDB 对 NULL 值的管理方式不同。在 AUTO_INCREMENT 列中插入值会导致序列中的下一个数字插入其位置。在 TIMESTAMP 字段中,MariaDB 会分配当前时间戳。在虚拟列(本教程稍后讨论的主题)中,将分配默认值。

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

NULL 值和 ALTER 命令

当使用 ALTER 命令修改列时,如果缺少 NULL 说明,MariaDB 会自动赋值。

MariaDB - 正则表达式

除了 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 不区分大小写,二进制字符串除外。

下面给出了可以使用的可能模式的表:

序号 模式和说明
1

^

匹配字符串的开头。

2

$

匹配字符串的结尾。

3

.

匹配单个字符。

4

[...]

匹配括号中的任何字符。

5

[^...]

匹配括号中未列出的任何字符。

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 - 事务

事务是顺序的组操作。它们作为一个单元运行,并且只有在组内所有操作成功执行后才能终止。组中的单个失败会导致整个事务失败,并且不会对数据库产生任何影响。

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

  • 原子性 — 通过在失败时中止并回滚更改来确保所有操作的成功。

  • 一致性 — 确保数据库在成功事务上应用更改。

  • 隔离性 — 使事务能够独立运行。

  • 持久性 — 确保在系统故障时成功事务的持久性。

事务语句的开头是 START TRANSACTION 语句,后跟 COMMIT 和 ROLLBACK 语句:

  • START TRANSACTION 开始事务。

  • COMMIT 将更改保存到数据。

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

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

注意 — 有些语句会导致隐式提交,并且在事务中使用时也会导致错误。此类语句的示例包括但不限于 CREATE、ALTER 和 DROP。

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

AUTOCOMMIT 变量提供对事务的控制。设置为 1 会强制所有操作都被视为成功事务,设置为 0 会导致更改的持久性仅在显式 COMMIT 语句上发生。

事务的结构

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

查看以下示例:

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

MariaDB - ALTER 命令

ALTER 命令提供了一种更改现有表结构的方法,这意味着可以进行修改,例如删除或添加列、修改索引、更改数据类型或更改名称。当元数据锁处于活动状态时,ALTER 也会等待应用更改。

使用 ALTER 修改列

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;

使用 ALTER 修改表

使用 TYPE 子句更改表类型:

mysql> ALTER TABLE products_tbl TYPE = INNODB;

使用 RENAME 关键字重命名表:

mysql> ALTER TABLE products_tbl RENAME TO products2016_tbl;

MariaDB - 索引和统计表

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

有四种类型的索引:

  • 主键(一条记录代表所有记录)

  • 唯一键(一条记录代表多条记录)

  • 普通索引

  • 全文索引(允许在文本搜索中使用许多选项)。

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

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

尽管索引可以加快搜索或 SELECT 语句的速度,但由于它们会在表和索引上执行操作,因此它们会使插入和更新变慢。

创建索引

可以通过 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 INDEX 或 ALTER TABLE...DROP 删除索引。支持可读性、可维护性和最佳实践的最佳选项是 DROP INDEX。

查看下面给出的删除索引的通用语法:

DROP INDEX index_name ON table_name;

查看其用法的示例:

DROP INDEX top_sellers ON product_tbl;

重命名索引

使用 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;

管理索引

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

查看以下示例:

mysql > SHOW INDEX FROM products_tbl\G

表统计信息

鉴于可以更快地访问记录以及提供的统计信息,索引被大量用于优化查询。但是,许多用户发现索引维护很麻烦。MariaDB 10.0 提供了存储引擎无关的统计表,这些表会为每个存储引擎中的每个表计算数据统计信息,甚至会为未建立索引的列计算统计信息。

MariaDB - 临时表

由于速度或数据可丢弃性,某些操作可以从临时表中受益。临时表的生命周期在会话终止时结束,无论您是从命令提示符、使用 PHP 脚本还是通过客户端程序使用它们。它也不会以典型的方式显示在系统中。SHOW TABLES 命令不会显示包含临时表的列表。

创建临时表

在 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 子句克隆现有表,这意味着会复制现有表的所有一般特性。由于使用了 TEMPORARY 关键字,因此创建临时表的 CREATE TABLE 语句不会提交事务。

虽然临时表与非临时表不同,并在会话结束时自动删除,但它们也可能存在一些冲突:

  • 有时会与已过期会话中的“幽灵”临时表冲突。

  • 有时会与非临时表的影子名称冲突。

注意:临时表可以与现有的非临时表同名,因为 MariaDB 将它们视为不同的引用。

权限管理

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

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

删除临时表

虽然临时表会在会话结束时自动删除,但您也可以选择手动删除它们。删除临时表需要使用 TEMPORARY 关键字,最佳实践建议在删除任何非临时表之前删除临时表。

mysql> DROP TABLE order;

MariaDB - 表克隆

某些情况下需要生成现有表的精确副本。CREATE...SELECT 语句无法生成此输出,因为它会忽略索引和默认值等信息。

复制表的步骤如下:

  • 使用 SHOW CREATE TABLE 生成一个 CREATE TABLE 语句,该语句详细说明源表的整个结构。

  • 修改该语句,为表指定一个新名称,然后执行它。

  • 如果还需要复制表数据,可以使用 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 - 序列

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

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

安装 Sequence 引擎

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

INSTALL SONAME "ha_sequence";

安装后,验证它:

SHOW ENGINES\G

请记住,引擎安装后,不能创建使用 sequence 语法的标准表,但可以使用 sequence 语法的名称创建临时表。

创建序列

有两种创建序列的方法:

  • 创建一个表,并使用 AUTO_INCREMENT 属性将列定义为自动递增。

  • 使用现有数据库,并使用 sequence SELECT 查询生成序列。该查询使用 seq_ [FROM] _to_[TO] 或 seq_[FROM]_to_[TO]_step_STEP 语法。

最佳实践建议使用第二种方法。以下是一个序列创建示例:

SELECT * FROM seq_77_to_99;

序列有很多用途:

  • 查找列中缺失的值,以防止操作中出现相关问题:

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

SELECT x1.seq, x2.seq FROM seq_5_to_9 x1 JOIN seq_5_to_9 x2 ORDER BY 5, 6;
  • 查找数字的倍数:

SELECT seq FROM seq_3_to_100_step_4;
  • 构造日期序列,用于预订系统等应用程序。
  • 构造时间序列。

MariaDB - 管理重复数据

如之前的课程中所述,MariaDB 在某些情况下允许重复记录和表。由于不同的数据或对象类型,或由于操作对象的唯一生命周期或存储,其中一些重复项实际上并非重复项。这些重复项通常也不会造成问题。

在某些情况下,重复项确实会导致问题,它们通常是由于隐式操作或 MariaDB 命令的宽松策略造成的。有一些方法可以控制这个问题,查找重复项,删除重复项,并防止重复项的创建。

策略和工具

管理重复项的主要方法有四种:

  • 使用 JOIN 查找它们,并使用临时表删除它们。

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

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

  • 使用 INSERT IGNORE 来阻止插入重复项。

使用 JOIN 和临时表

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

使用 INSERT

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

以下示例显示了在将数据插入已填充字段的索引值表中时会发生什么:

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

注意:如果未找到键,则 INSERT...ON DUPLICATE KEY UPDATE 语句将像普通的插入语句一样执行。

使用 DISTINCT

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

SELECT DISTINCT fields
FROM table
[WHERE conditions];

注意:包含 DISTINCT 子句的语句的结果:

  • 使用一个表达式时,它会返回该表达式的唯一值。

  • 使用多个表达式时,它会返回唯一的组合。

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

以下语句使用 DISTINCT 子句处理单个表达式:

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

以下示例使用多个表达式:

SELECT DISTINCT product_name, product_id
FROM products
WHERE product_id < 30

使用 INSERT IGNORE

INSERT IGNORE 语句指示 MariaDB 在发现重复记录时取消插入。以下是一个使用示例:

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

此外,请注意重复项背后的逻辑。某些表需要重复项,这取决于该表数据的性质。在管理重复记录的策略中要考虑到这一点。

MariaDB - SQL 注入防护

仅仅接受用户输入就会为漏洞敞开大门。这个问题主要源于数据的逻辑管理,但幸运的是,避免这些主要缺陷相当容易。

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 子句。

考虑所有类型的必要的显式输入控制,例如:

  • 控制使用的转义字符。

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

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

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

您可能不知道注入攻击的危险,或者认为它们微不足道,但它们是安全问题的首要问题。此外,请考虑以下两个条目的影响:

1=1
-or-
*

如果代码允许输入其中任何一个以及正确的命令,可能会导致泄露数据库上的所有用户数据或删除数据库上的所有数据,而且这两种注入都不是特别巧妙的。在某些情况下,攻击者甚至不会花时间检查漏洞;他们会使用简单的输入进行盲目攻击。

此外,还要考虑与 MariaDB 配对的任何编程/脚本语言提供的模式匹配和正则表达式工具,这些工具提供了更多控制,有时还提供更好的控制。

MariaDB - 备份方法

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

选项

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

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

  • 物理备份的大小小于逻辑备份,执行和恢复所需的时间也更短。物理备份还包括日志和配置文件,但逻辑备份不包括。

备份工具

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

mysqldump 备份有三个选项:

  • 原始数据:通过 --tab 选项将表作为原始数据文件转储,该选项还指定文件的目标:

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

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

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

使用 SELECT...INTO OUTFILE 语句

导出数据的另一个选项是使用 SELECT...INTO OUTFILE 语句。此简单选项将表输出到简单格式的文本文件:

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

其属性允许您根据自己的喜好格式化文件。

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

  • 文件名必须指定您希望输出的位置。

  • 您需要 MariaDB 文件权限才能执行该语句。

  • 输出文件名必须唯一。

  • 您需要主机上的登录凭据。

  • 在 UNIX 环境中,输出文件对所有人可读,但其服务器所有权会影响您删除它的能力。确保您拥有权限。

在备份中使用 CONNECT

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';

其他工具

其他备份选项如下:

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

  • 快照:某些文件系统允许快照。此过程包括使用读锁刷新表、安装快照、解锁表、复制快照,然后卸载快照。

  • LVM:此常用方法使用 Perl 脚本。它会对每个表获取读锁并将缓存刷新到磁盘。然后它获取快照并解锁表。有关更多信息,请访问官方的mylvmbackup 网站。

  • TokuBackup:Percona 提供的此解决方案考虑了 InnoDB 备份选项的问题和局限性。它会在应用程序继续操作文件的同时生成文件的交易声音副本。请访问 Percona 网站了解更多信息。

InnoDB 注意事项

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

MariaDB - 备份加载方法

本章,我们将学习各种备份加载方法。从备份恢复数据库是一个简单但有时非常耗时的过程。

数据加载有三种方法:LOAD DATA 语句、mysqlimport 和简单的 mysqldump 恢复。

使用 LOAD DATA

LOAD DATA 语句充当批量加载器。请查看一个使用 LOAD DATA 语句加载文本文件的示例:

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

请注意 LOAD DATA 语句的以下特性:

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

  • 该语句假设格式由换行符 (换行) 终止的行组成,数据值以制表符分隔。

  • 使用 FIELDS 子句显式指定一行中字段的格式。使用 LINES 子句指定行结束符。请查看以下示例:

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

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

使用 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

使用 MYSQLDUMP

使用 **mysqldump** 恢复需要使用以下简单语句将转储文件加载回主机:

shell> mysql database_name < source_file.sql

特殊字符和引号

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

MariaDB - 常用函数

本章包含最常用的函数列表,提供定义、解释和示例。

MariaDB 聚合函数

以下是常用的聚合函数:

序号 名称和描述
1

COUNT

它计算记录的数量。

**示例**:SELECT COUNT(*) FROM customer_table;

2

MIN

它显示一组记录的最小值。

**示例**:SELECT organization, MIN(account) FROM contracts GROUP BY organization;

3

MAX

它显示一组记录的最大值。

**示例**:SELECT organization, MAX(account_size) FROM contracts GROUP BY organization;

4

AVG

它计算一组记录的平均值。

**示例**:SELECT AVG(account_size) FROM contracts;

5

SUM

它计算一组记录的总和。

**示例**:SELECT SUM(account_size) FROM contracts;

MariaDB 年龄计算

**TIMESTAMPDIFF** 函数提供了一种计算年龄的方法:

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

MariaDB 字符串连接

**CONCAT** 函数在连接操作后返回结果字符串。您可以使用一个或多个参数。请查看以下语法:

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

查看以下示例:

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

MariaDB 日期/时间函数

以下是重要的日期函数:

序号 名称和描述
1

CURDATE()

它以 yyyy-mm-dd 或 yyyymmdd 格式返回日期。

**示例**:SELECT CURDATE();

2

DATE()

它以多种格式返回日期。

**示例**:CREATE TABLE product_release_tbl (x DATE);

3

CURTIME()

它以 HH:MM:SS 或 HHMMSS.uuuuuu 格式返回时间。

**示例**:SELECT CURTIME();

4

DATE_SUB()

它从指定的日期添加或减去一定数量的天数。

**示例**:SELECT DATE_SUB('2016-02-08', INTERVAL 60 DAY);

5

DATEDIFF()

它确定两个日期之间的天数。

**示例**:SELECT DATEDIFF('2016-01-01 23:59:59','2016-01-03');

6

DATE_ADD()

它向日期和时间添加或减去任何时间单位。

**示例**:SELECT DATE_ADD('2016-01-04 23:59:59', INTERVAL 22 SECOND);

7

EXTRACT()

它从日期中提取一个单位。

**示例**:SELECT EXTRACT(YEAR FROM '2016-01-08');

8

NOW()

它以 yyyy-mm-dd hh:mm:ss 或 yyyymmddhhmmss.uuuuuu 格式返回当前日期和时间。

**示例**:SELECT NOW();

9

DATE_FORMAT()

它根据指定的格式字符串格式化日期。

**示例**:SELECT DATE_FORMAT('2016-01-09 20:20:00', '%W %M %Y');

以下是一些重要的时钟函数:

序号 名称和描述
1

HOUR()

它返回时间的小时数,或经过的小时数。

**示例**:SELECT HOUR('19:17:09');

2

LOCALTIME()

它的功能与 NOW() 完全相同。

3

MICROSECOND()

它返回时间中的微秒数。

**示例**:SELECT MICROSECOND('16:30:00.543876');

4

MINUTE()

它返回时间中的分钟数。

**示例**:SELECT MINUTE('2016-05-22 17:22:01');

5

SECOND()

它返回日期中的秒数。

**示例**:SELECT SECOND('2016-03-12 16:30:04.000001');

6

TIME_FORMAT()

它根据指定的格式字符串格式化时间。

**示例**:SELECT TIME_FORMAT('22:02:20', '%H %k %h %I %l');

7

TIMESTAMP()

它以 yyyy-mm-dd hh:mm:dd 的格式提供活动的 timestamp。

**示例**:CREATE TABLE orders_ (ID INT, tmst TIMESTAMP);

MariaDB 数值函数

以下是 MariaDB 中一些重要的数值函数:

序号 名称和描述
1

TRUNCATE()

它返回截断到指定小数位的数字。

**示例**:SELECT TRUNCATE(101.222, 1);

2

COS()

它返回 x 弧度的余弦值。

**示例**:SELECT COS(PI());

3

CEILING()

它返回不小于 x 的最小整数。

**示例**:SELECT CEILING(2.11);

4

DEGREES()

它将弧度转换为度。

**示例**:SELECT DEGREES(PI());

5

DIV()

它执行整数除法。

**示例**:SELECT 100 DIV 4;

6

EXP()

它返回 e 的 x 次方。

**示例**:SELECT EXP(2);

7

FLOOR()

它返回不大于 x 的最大整数。

**示例**:SELECT FLOOR(2.01);

8

LN()

它返回 x 的自然对数。

**示例**:SELECT LN(3);

9

LOG()

它返回自然对数或给定基数的对数。

**示例**:SELECT LOG(3);

10

SQRT()

它返回平方根。

**示例**:SELECT SQRT(16);

MariaDB 字符串函数

以下是重要的字符串函数:

序号 名称和描述
1

INSTR()

它返回子字符串第一次出现的 位置。

**示例**:SELECT INSTR('rambutan', 'tan');

2

RIGHT()

它返回最右边的字符串字符。

**示例**:SELECT RIGHT('rambutan', 3);

3

LENGTH()

它返回字符串的字节长度。

**示例**:SELECT LENGTH('rambutan');

4

LOCATE()

它返回子字符串第一次出现的 位置。

**示例**:SELECT LOCATE('tan', 'rambutan');

5

INSERT()

它返回一个字符串,其中在特定位置插入了指定的子字符串,该字符串已被修改。

**示例**:SELECT INSERT('ramputan', 4, 1, 'b');

6

LEFT()

它返回最左边的字符。

**示例**:SELECT LEFT('rambutan', 3);

7

UPPER()

它将字符更改为大写。

**示例**:SELECT UPPER(lastname);

8

LOWER()

它将字符更改为小写。

**示例**:SELECT LOWER(lastname);

9

STRCMP()

它比较字符串,当它们相等时返回 0。

**示例**:SELECT STRCMP('egg', 'cheese');

10

REPLACE()

它在替换字符后返回字符串。

**示例**:SELECT REPLACE('sully', 'l', 'n');

11

REVERSE()

它反转字符串中的字符。

**示例**:SELECT REVERSE('racecar');

12

REPEAT()

它返回重复给定字符 x 次的字符串。

**示例**:SELECT REPEAT('ha ', 10);

13

SUBSTRING()

它从字符串中返回子字符串,从位置 x 开始。

**示例**:SELECT SUBSTRING('rambutan',3);

14

TRIM()

它从字符串中删除尾随/前导字符。

**示例**:SELECT TRIM(LEADING '_' FROM '_rambutan');

广告
© . All rights reserved.