5up3rh3iblog

在menzhi007的blog里看到非常有意思的东西:

">/database/201003/45293.html

在手册里:

MySQL按照以下规则进行数值比较:

  • 若有一个或两个参数 NULL,除非NULL-safe <=> 等算符,则比较运算的结果为NULL
  • 若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。
  • 若两个参数均为整数,则按照整数进行比较。
  • 十六进制值在不需要作为数字进行比较时,则按照二进制字符串进行处理。
  • 假如参数中的一个为 TIMESTAMP DATETIME 列,而其它参数均为常数, 则在进行比较前将常数转为 timestamp。这样做的目的是为了使ODBC的进行更加顺利。 注意,这不适合IN()中的参数!为了更加可靠,在进行对比时通常使用完整的 datetime/date/time字符串。
  • 在其它情况下,参数作为浮点数进行比较。  

在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252 Latin1,同时对英语也适合)

为了进行比较,可使用CAST()函数将某个值转为另外一种类型。 使用CONVERT()将字符串值转为不同的字符集。请参见

以下例子说明了比较运算中将字符串转为数字的过程:

mysql> SELECT 1 > 6x;

        -> 0

mysql> SELECT 7 > 6x;

        -> 1

mysql> SELECT 0 > x6;

        -> 0

mysql> SELECT 0 = x6;

        -> 1

这个如果不注意好确实可以导致安全问题的,比如menzhi007里举的那个列子,如果字符变量查询没有引号,但是用某些函数过滤了不可以直接注射,那么可以直接提交0就可以绕过了...

最后感谢menzhi007及hi群的各大牛的讨论,尤其是ryat牛的指点:)