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的語句在解釋裡,實際 上它是會被推行的