MySQL 的字符串比较规则是什么?
What's MySQL's string compare rule?
为什么 SELECT * FROM users WHERE password='a'='mm';
实际上 return 行?
为什么 SELECT * FROM users WHERE password='1'='1';
不起作用?
使用的确切相等运算符比较规则是什么?
更新(表格和行等信息):
mysql> show tables;
+------------------+
| Tables_in_shengy |
+------------------+
| users |
+------------------+
1 row in set (0.00 sec)
mysql> describe users;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| username | varchar(255) | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> select * from users;
+----------+----------+
| username | password |
+----------+----------+
| victim | 123456 |
+----------+----------+
1 row in set (0.00 sec)
MySQL 将比较转换为 0
和 1
.
因此 password='a'
的计算结果为 0
(除非 password
实际上 是 'a'
)。
另外 MySQL 尝试通过将字符串从头开始转换为数字来比较字符串和数字。
因此 0abc
将转换为 0
。 abc
根本不是数字,也是 0
。
也就是说
password='a'='mm'
结果
0='mm'
并且由于 mm
没有任何前导数字,您得到
0=0
这是真的。
为什么 SELECT * FROM users WHERE password='a'='mm';
实际上 return 行?
为什么 SELECT * FROM users WHERE password='1'='1';
不起作用?
使用的确切相等运算符比较规则是什么?
更新(表格和行等信息):
mysql> show tables;
+------------------+
| Tables_in_shengy |
+------------------+
| users |
+------------------+
1 row in set (0.00 sec)
mysql> describe users;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| username | varchar(255) | YES | | NULL | |
| password | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> select * from users;
+----------+----------+
| username | password |
+----------+----------+
| victim | 123456 |
+----------+----------+
1 row in set (0.00 sec)
MySQL 将比较转换为 0
和 1
.
因此 password='a'
的计算结果为 0
(除非 password
实际上 是 'a'
)。
另外 MySQL 尝试通过将字符串从头开始转换为数字来比较字符串和数字。
因此 0abc
将转换为 0
。 abc
根本不是数字,也是 0
。
也就是说
password='a'='mm'
结果
0='mm'
并且由于 mm
没有任何前导数字,您得到
0=0
这是真的。