Как столбцы числовой базы данных sql работают с числовыми строковыми значениями

#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.