MYSQL Очень странное поведение выбора

У меня есть таблица пользователей Mysql (5.1.58-1ubuntu1) (механизм хранения InnoDB, сопоставление utf8 general ci) с 3 полями (для простоты):

  • id : int (первичный ключ)
  • имя пользователя : varchar(255) - utf8_general_ci
  • пароль: varchar(255) - utf8_general_ci

В этой таблице всего две записи (всегда для простоты):

id| username | password
-----------------------
1 | myuser   | custom1
2 | myuser2  | custom2

Итак, если я запускаю этот запрос

 select * from users where username = 0 and password = 0

mysql возвращает мне все записи.

Наоборот, если я запускаю запрос ниже

select * from users where username = '0' and password = '0'

MySql возвращает мне пустой набор.

На мой взгляд, это поведение очень странное и похоже на Hard Bug.

У кого-нибудь есть пояснения?


person alesdario    schedule 10.12.2011    source источник


Ответы (1)


Это не ошибка. Вы можете сравнивать только значения одного и того же типа, поэтому MySQL молча преобразует ваш текст «myuser» в целое число со значением 0.

person Lukáš Lalinský    schedule 10.12.2011
comment
Именно так MySQL выполняет преобразования. Если у вас есть целочисленный столбец и вы пытаетесь вставить в него текст, он преобразует его в 0. То же самое произойдет, например, для даты, или если вы попытаетесь вставить текст за пределы столбца, он будет молча обрезан. . - person Lukáš Lalinský; 10.12.2011
comment
@alesdario, потому что в MySQL есть набор правил преобразования типов (dev .mysql.com/doc/refman/5.1/en/type-conversion.html) и обрабатывает значения, сопоставимые после приведения. - person newtover; 10.12.2011