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 将比较转换为 01.

因此 password='a' 的计算结果为 0(除非 password 实际上 'a')。

另外 MySQL 尝试通过将字符串从头开始转换为数字来比较字符串和数字。

因此 0abc 将转换为 0abc 根本不是数字,也是 0

也就是说

password='a'='mm'

结果

0='mm'

并且由于 mm 没有任何前导数字,您得到

0=0

这是真的。