select'' - ''是什么意思

时间:2013-01-19 05:22:45

标签: mysql sql

有一篇关于SQL注入的文章:Abusing MySQL string arithmetic for tiny SQL injections

问题是,select ''-''的含义是什么?我尝试使用MySQL,然后返回:

mysql> select ''-'';
+-------+
| ''-'' |
+-------+
|     0 |
+-------+
1 row in set (0.00 sec)

发生什么事了? 0是什么意思?

select '-'的结果:

mysql> select '-';
+---+
| - |
+---+
| - |
+---+
1 row in set (0.00 sec)

我对这些结果感到非常困惑。

3 个答案:

答案 0 :(得分:3)

从一个空字符串-到其他字符

,您为负''

见以下内容:

mysql> select '';
+--+
|  |
+--+
|  |
+--+
1 row in set (0.00 sec)  

mysql> select '3'-'2';
+---------+
| '3'-'2' |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

但警告如果它不是数字字符串

mysql> select 'a'-'b';
+---------+
| 'a'-'b' |
+---------+
|       0 |
+---------+
1 row in set, 2 warnings (0.00 sec)    

两个警告:

mysql> SHOW WARNINGS LIMIT 2
    -> ;
+---------+------+---------------------------------------+
| Level   | Code | Message                               |
+---------+------+---------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'b' |
+---------+------+---------------------------------------+
2 rows in set (0.00 sec)  

为什么empty字符串没有警告?

因为没有关于空字符串的警告,因为它(已铸造的东西)0见下文:

mysql> SELECT 0 = '';
+--------+
| 0 = '' |
+--------+
|      1 |
+--------+
1 row in set (0.00 sec)   

因此,您正在执行''-''

0 - 0
mysql> SELECT '' - '';
+---------+
| '' - '' |
+---------+
|       0 |
+---------+
1 row in set (0.00 sec)  

为了更清楚,我正在添加以下示例(我认为对您有帮助):
如何转换:

mysql> SELECT '0' = 0
    -> ;
+---------+
| '0' = 0 |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)  

注意其转换:

mysql> SELECT '' = '0'
    -> ;
+----------+
| '' = '0' |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)  

''已转换为0'0'转换为0''不等于'0'

mysql> SELECT '1' = 1
    -> ;
+---------+
| '1' = 1 |
+---------+
|       1 |
+---------+
1 row in set (0.00 sec)

mysql> SELECT '' = 1
    -> ;
+--------+
| '' = 1 |
+--------+
|      0 |
+--------+
1 row in set (0.00 sec) 

答案 1 :(得分:2)

我会将select ''-''解释为与select '' - ''相同的select cast('' as int) - cast('' as int) select 0-0

使用select '-',您只需获得一个字符串。希望有意义......

答案 2 :(得分:1)

''是一个空字符串; -是减法。所以你要从另一个中减去一个空字符串。减法是一个数字运算符,因此它的结果是一个数字,mysql在减去它们之前将其参数转换为数字。 ''的数值为零 - 但它并不重要,因为从中减去的任何数字无论如何都将为零。

相关问题