发现有人对这个不是很了解,就转了点东西……
关于SQL语句注释中的叹号,这是Mysql对SQL注释的扩展,有条件的执行注释中的语句,MySQL服务器能够解析并执行注释中的代码,就像对待其他MySQL语句一样,但其他SQL服务器将忽略这些扩展。
再贴一些网上的资料:
1.8.4. MySQL对标准SQL的扩展
之前一直不明白Mysql注释中的叹号是什么东西,直到看了下边的Manual文档中的内容。
MySQL服务器包含一些其他SQL DBMS中不具备的扩展。注意,如果使用了它们,将无法把代码移植到其他SQL服务器。在某些情况下,你可以编写包含MySQL扩展的代码,但仍保持其可移植性,方法是用“/*... */”注释掉这些扩展。在本例中,MySQL服务器能够解析并执行注释中的代码,就像对待其他MySQL语句一样,但其他SQL服务器将忽略这些扩展。例如:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
如果在字符“!”后添加了版本号,仅当MySQL的版本等于或高于指定的版本号时才会执行注释中的语法:
CREATE /*!32302 TEMPORARY */ TABLE t (a INT);
这意味着,如果你的版本号为3.23.02或更高,MySQL服务器将使用TEMPORARY关键字。
今天是在看5.1的Partition表的show create table的时候,又去想这个问题的,如下为一个partition表的创建语法:只有版本大于5.1才会去做注释里边的内容。我不明白的是5.1怎么是50100这么个表示,MS二级版本
CREATE TABLE `log_data` ( `hap_date` date DEFAULT NULL, `uin` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50100 PARTITION BY LIST (to_days(hap_date)) (PARTITION P_20080523 VALUES IN (733550) ENGINE = InnoDB) */
还有一个是以前很迷惑的,在mysqldump过程中那些select都是带有SQL_NO_CACHE的,不知道为什么,其实Manual里边都有解释
SELECT /*!40001 SQL_NO_CACHE */ * FROM `tbMail_1`;
· SQL_NO_CACHE告知MySQL不要把查询结果存储在查询缓存中。请参见5.13节,“MySQL查询高速缓冲”。对于一个使用UNION或子查询的查询,本选项会影响查询中的SELECT。
其实mysqldump结果SQL里边很多这样的东东:
代表了各个版本Mysql引进的一些东东。
/*!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 gbk */; /*!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 */;
以上内容转自:http://space.itpub.net/82392/viewspace-406705
这些技巧经常用于 Sql 注入中,参考资料: