Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL查询行为奇怪_Mysql_Innodb - Fatal编程技术网

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注入漏洞。这是一个字符串值,可能会暴露漏洞