Sorry in advance – this seems like a really dumb question. But…
If I run a select query on a varchar() column, but use zero for the column value in the where clause – why does it return all rows?
For example:
CREATE TABLE test ( id INT, person varchar(50) ); INSERT INTO test (id, person) VALUES (1, "Alice"); INSERT INTO test (id, person) VALUES (2, "Bob"); SELECT * FROM test where person = 0;
I would expect this to either return an error, or an empty result set. Instead, it returns all rows?!?!
Why is that?
Advertisement
Answer
The expression:
person = 0
contains 2 operands of different data types.
In this case MySql does implicit conversion as it is explained in 12.2 Type Conversion in Expression Evaluation
So a value like 'Bob'is implicitly converted to a floating-point value and this value is 0.
There are cases where a string will be converted to a value different than 0, like when the string begins with a numeric part and then that numeric part is its converted value, so:
'12abc6'will be converted to12and'5.6xyz0'will be converted to5.6
An exception to this rule is a string like '2e3' which is interpreted as 2 * 10^3 (scientific notation) so it is converted to 2000.
In your code all the names are converted to 0, so the condition becomes:
0 = 0
which is always true.