为什么3行删除sql查询拼图?

时间:2011-09-28 10:03:27

标签: mysql sql

有人可以告诉我这方面的技术原因吗?

CREATE TABLE test (
  id varchar(3) NOT NULL,
  PRIMARY KEY  (id)
);

INSERT INTO test VALUES ('0'), ('1'), ('2'), ('ab'), ('bb');

select * from test;

DELETE FROM test WHERE id=0;

Which Deletes 3 rows from table test.

5 个答案:

答案 0 :(得分:6)

因为:

SELECT 0 = 'ab';
+----------+
| 0 = 'ab' |
+----------+
|        1 |
+----------+

要使用BINARY运算符删除确切的行,它将强制逐字节比较 -

DELETE FROM test WHERE id = BINARY 0;

答案 1 :(得分:5)

将数字与字符串进行比较时,会将它们作为浮点数进行比较。任何不以数字开头的字符串都会隐式转换为数字0。

答案 2 :(得分:0)

字符'0'和整数0之间存在差异。当你将Char与整数比较时,Char字符串(如果不是整数)返回false值(i,e)A 0因此使条件为真并删除你的表中的第一行,第四行和第五行......要删除你需要检查条件的特定行......

从id ='0'的测试中删除; (字符0不是整数0)

答案 3 :(得分:0)

请尝试比较相同类型的值,例如

DELETE FROM test WHERE id = CAST(0 AS VARCHAR(3));

答案 4 :(得分:0)

当我看到这个时,我首先感到困惑,但现在我明白了 当你在跑步时

select * from test;

DELETE FROM test WHERE id=0;

此查询将每一行比较为整数而不是字符串, 所以当MySQL来到ab& bb so MySQL将其作为0并删除它 如果你用1ab这样的任何数字启动它,那么MySQL将1ab作为1当你触发查询删除1而不是0时它将删除1ab

尝试

select * from test;

DELETE FROM test WHERE id='0';

此代码将行比较为字符串,因此当他得到精确的“0”时,MySQL将其删除。