0

所以我有这个查询

 SELECT COUNT(b.user_ticket_id) as tiketscount
 FROM event_tickets a
 INNER JOIN user_tickets b ON a.event_ticket_id = b.event_ticket_id
 WHERE b.status = 'used' AND a.event_id = '1'

这给了我预期的结果(count = 1),我决定尝试下面的代码查询

 SELECT COUNT(b.user_ticket_id) as tiketscount
 FROM event_tickets a
 INNER JOIN user_tickets b ON a.event_ticket_id = b.event_ticket_id
 WHERE b.status = 'used' AND a.event_id = '1  DROP TABLE contact "1=1"'

我得到了与以前相同的结果,但是当我将一个更改为 2 时,如下所示,没有结果,mysql 是否有可能使用它找到的第一个字符?

 SELECT COUNT(b.user_ticket_id) as tiketscount
 FROM event_tickets a
 INNER JOIN    user_tickets b ON a.event_ticket_id = b.event_ticket_id
 WHERE b.status = 'used' AND a.event_id = '2  DROP TABLE contact "1=1"'

任何人都知道为什么这是可能的?谢谢

我正在使用 MYSQL 5.5.30 InnoDB

4

3 回答 3

1

event_id 是某种类型的数字列类型(可能是 INT),因此 MySQL 正在转换您的字符串'1 DROP TABLE contact "1=1"'1使其与第一个查询相同。

在第三个查询中,它也在尽力转换值,并做同样的事情,将查询提炼为:

SELECT COUNT(b.user_ticket_id) as tiketscount FROM event_tickets a INNER JOIN    user_tickets b ON a.event_ticket_id = b.event_ticket_id
WHERE b.status = 'used' AND a.event_id = 2

我会假设没有event_id2 和status“使用”的记录。

如果您的列是 INT 而不是某种形式的文本,则无需将您的数字括在引号中,实际上不鼓励这样做。

于 2013-07-24T19:04:57.367 回答
1

这是可能的,因为 MySQL 正在进行隐式数据转换。MySQL 正在将提供的字符串文字转换为数字。

作为正在发生的事情的演示,请尝试以下查询:

SELECT '123ABC  ' + 0
SELECT 'A1B2    ' + 0
SELECT '1.23D56 ' + 0
SELECT ' 78 90  ' + 0 

您会发现 MySQL 正在读取字符串文字,并将值转换为数值。它从字符串的最左边的字符开始,一次读取一个字符(从左到右),直到它到达字符串的末尾,或者直到它遇到一个导致字符串无法转换为数值的字符.

您还可以使用示例中的字符串文字尝试相同类型的查询,

 SELECT '1  DROP TABLE contact "1=1"' + 0 
 SELECT '2  DROP TABLE contact "1=1"' + 0 

它们分别返回数值 1 和 2。

考虑到其他数据库(如 Oracle 和 SQL Server)在将其中一些相同的字符串转换为数字时会抛出错误,这种行为似乎有些“奇怪”。MySQL 更宽松,并假设任何字符串值都可以转换为数字。

于 2013-07-24T19:14:30.453 回答
1

一个简单的例子:

mysql> create table foo (id int);
mysql> insert into foo (id) values (1), (2), (3);
mysql> select id from foo where id='2 DROP TABLE';
+------+
| id   |
+------+
|    2 |
+------+
1 row in set, 1 warning (0.00 sec)

mysql> select id from foo where id='4 DROP TABLE';
Empty set, 1 warning (0.00 sec)

mysql> select id from foo where id='0 DROP TABLE';
Empty set, 1 warning (0.00 sec)

由于您的2 DROP TABLE ...字符串以数字开头,因此 MySQL 会“礼貌地”将其自动转换为 int 以匹配 id 字段。所以基本上1or2被保留了,其余的字符串被简单地再次抛出。

请注意,当我使用0or4作为初始数字进行测试时,没有找到任何行,因为表中没有具有 id04的行。

另请注意,MySQL 正在发出警告。本案案文为:

mysql> show warnings;
+---------+------+--------------------------------------------------+
| Level   | Code | Message                                          |
+---------+------+--------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '0 DROP TABLE' |
+---------+------+--------------------------------------------------+

所以是的,MySQL 只是截断“数字”的字符串部分。

于 2013-07-24T19:30:59.323 回答