#mysql #sql
Вопрос:
У меня есть вопрос, связанный с SQL.
Я недавно кодировал приложение, в котором sql-запрос генерируется динамически на основе входных данных пользователя из пользовательского интерфейса. Интересно, что все значения, переданные из пользовательского интерфейса, состояли из строк. Мне сказали добавить поддержку числовых значений. Но я заметил, что переход numeric string value
в числовое поле также работает.
например:
Select * from employee where id = 36815
и
Select * from employee where id = "36815"
Мой вопрос в том, почему второй запрос работает. Даже если я поменяю =
оператора на <
или >
, он все равно будет работать. Я хочу знать, почему это работает и должны ли мы поддерживать это как есть. Каковы могут быть недостатки использования числовых строковых полей для числовых столбцов БД.
Спасибо.
Ответ №1:
Значения в базах данных имеют типы. И вам следует научиться не смешивать типы в выражениях-особенно в where
on
предложениях и-потому что такое смешивание может сбить оптимизатора с толку.
Что происходит в твоем выражении лица? Компилятор SQL видит что-то вроде:
where <number> = <string>
По правилам SQL, в нем говорится, что строка должна быть преобразована в число. MySQL делает это путем преобразования начальных цифр. Таким образом, в результате получается что-то вроде:
where <number> = cast(string as int)
(хотя допускаются нецелые числа).
Обратите внимание, что это не основано на том, что строка является константой. Только по типу столбцов. Итак, если бы выражение было:
where stringcol = 5
Затем stringcol
будет преобразовано в число.
Комментарии:
1. Правила, применяемые в MySQL, полностью описаны в разделе Преобразование типов при вычислении выражений .
2. есть ли недостатки во втором запросе? Если мы знаем, что преобразования типов являются неявными.
3. @Sagar . . .. Да. Смешивание типов может сбить с толку оптимизатора и привести к замедлению выполнения запросов. Это также может привести к неожиданным совпадениям. Например
1 = '1x'
, принимает значение true, а не false.