Mysql中備份資料檔案中/*!*/的含義

DawnTraveler發表於2024-03-23

1.問題

在備份資料庫時,我們發現生成的備份檔案中,存在這樣一系列程式碼:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

那麼它們究竟是註釋還是什麼用呢?

2.解決

參考:Mysql中 /*[歎號] */含義

2.1 /!/會被執行

/* .... / 在大部分語言中都一樣是註釋。這個之中的語句是不被執行的。
但MYSQL中 為了保持相容,比如從mysqldump 匯出的SQL語句能被其它資料庫直接使用,它把一些特有的僅在MYSQL上的語句放在 /
! ... */ 中,這樣這些語句如果在其它資料庫中是不會被執行,但在MYSQL中它會執行。

2.2 mysql /*!50001 註釋解釋

在MySQL裡,多行解釋 是 /* /,這個是SQL的標準
但是MySQL擴張了解釋的功能
假如在起頭的/
後頭加了驚歎號,那麼此解釋裡的語句將被推行
比如:

mysql> /*! select * from test */;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

這裡的50001表示,假如資料庫是5.00.01以上版本,該語句才會被推行。
因此固然你的mysqldump出來的成立 view的語句在解釋裡,實際 上它是會被推行的

相關文章