发现有人对这个不是很了解,就转了点东西……

关于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 注入中,参考资料:

突破 Sql 防注入过滤程序继续注入的一点方法、经验、技巧总结

SQL绕过注入最新代码

基于 SQL 注入(sql injection) 介绍一些注射技巧 - 技术文章