bitscn.com
5up3rh3iblog
在menzhi007的blog里看到非常有意思的东西:
http:///database/201003/45293.html
在mysql手册里:
phpchina.com/manual/mysql/functions.html#comparison-operators>http://www.phpchina.com/manual/mysql/functions.html#comparison-operators
mysql按照以下规则进行数值比较:
若有一个或两个参数为 null,除非null-safe 等算符,则比较运算的结果为null。 若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。 若两个参数均为整数,则按照整数进行比较。 十六进制值在不需要作为数字进行比较时,则按照二进制字符串进行处理。 假如参数中的一个为 timestamp 或 datetime 列,而其它参数均为常数, 则在进行比较前将常数转为 timestamp。这样做的目的是为了使odbc的进行更加顺利。 注意,这不适合in()中的参数!为了更加可靠,在进行对比时通常使用完整的 datetime/date/time字符串。 在其它情况下,参数作为浮点数进行比较。 在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252 latin1,同时对英语也适合)。
为了进行比较,可使用cast()函数将某个值转为另外一种类型。 使用convert()将字符串值转为不同的字符集。请参见12.8节,“cast函数和操作符”。
以下例子说明了比较运算中将字符串转为数字的过程:
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牛的指点:)
bitscn.com