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

廣告