MYSQL查询行为奇怪
所以我有这个疑问MYSQL查询行为奇怪,mysql,innodb,Mysql,Innodb,所以我有这个疑问 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_tick
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"'
我得到了与前面相同的结果,但是当我将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事件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
我假设没有事件id
为2且状态
为“已使用”的记录
如果您的列是INT,而不是某种形式的文本,则无需将您的数字括在引号中,实际上不建议这样做。event\u 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
我假设没有事件id
为2且状态
为“已使用”的记录
如果您的列是INT,而不是某种形式的文本,则无需将数字括在引号中,实际上不鼓励使用引号。这是可能的,因为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更为宽松,并假设任何字符串值都可以转换为数字。这是可能的,因为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更为宽松,并假设任何字符串值都可以转换为数字。一个简单的示例:
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字段。因此,基本上保留1
或2
,并再次抛出字符串的其余部分
请注意,当我使用0
或4
作为初始编号进行测试时,没有找到行,因为表中没有id为0
或4
的行
还要注意,MySQL正在发出警告。本案案文如下:
mysql> show warnings;
+---------+------+--------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '0 DROP TABLE' |
+---------+------+--------------------------------------------------+
是的,MySQL只是简单地截断了“数字”的字符串部分。一个简单的例子:
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字段。因此,基本上保留1
或2
,并再次抛出字符串的其余部分
请注意,当我使用0
或4
作为初始编号进行测试时,没有找到行,因为表中没有id为0
或4
的行
还要注意,MySQL正在发出警告。本案案文如下:
mysql> show warnings;
+---------+------+--------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '0 DROP TABLE' |
+---------+------+--------------------------------------------------+
是的,MySQL只是简单地截断了你的“数字”的字符串部分。谢谢,现在我明白了。谢谢,现在我明白了。谢谢,这很有意义,我是msql人,所以我很惊讶地看到它返回结果。谢谢你的见解谢谢,这很有意义,我是一个msql的人,所以我很惊讶地看到它返回的结果。谢谢你的见解谢谢,我现在明白了,我来自sqlserver,所以我很惊讶DMYSQL更灵活,更能接受事物。它有它的优点和缺点。在某些情况下,您可能确实希望它拒绝某些内容,您可以通过强制使用严格模式来做到这一点。谢谢,我现在明白了,我来自sqlserver,所以我很惊讶DMYSQL更加灵活,能够接受这些内容。它有它的优点和缺点。在某些情况下,您可能确实希望它拒绝某些内容,这可以通过强制严格模式来实现。除非您测试SQL注入漏洞,否则我看不出有任何理由使用这样的字符串文本值进行查询。下面是一个可能暴露漏洞的字符串值:“
1”或1=1--
”。我看不出有任何理由使用这样的字符串文本值进行查询,除非您测试SQL注入漏洞。这是一个字符串值,可能会暴露漏洞