Одиночные кавычки в запросах MySQL - PullRequest
0 голосов
/ 11 ноября 2011

Если у меня есть запрос MySQL, например:

SELECT this FROM that WHERE id='10'

и

SELECT this FROM that WHERE id=10

оба, кажется, работают правильно.

Какая польза от одиночных речевых меток в запросах MySQL? Когда их правильно использовать?

Ответы [ 4 ]

4 голосов
/ 11 ноября 2011

Когда MySQL выполняет запрос, происходит неявное преобразование аргумента.Если id - INT, тогда «10» приводится к целому числу.Если id это VARCHAR или другой текстовый тип, 10 приводится к строке.В обоих случаях оба запроса будут работать (если только вы не работаете в режиме STRICT).

С точки зрения производительности вы должны использовать правильный тип данных (не используйте кавычки для целочисленных аргументов) - неявныйПреобразование добавляет накладные расходы, и в некоторых случаях это может ухудшить производительность поиска по индексу.

С точки зрения безопасности проще всегда использовать кавычки и mysql_real_escape_string (в случае, если аргумент не заключен в кавычки, mysql_real_escape_string не остановит любойатака, в которой не используются кавычки, например «UNION SELECT password FROM users». Однако, лучший подход - привести вашу переменную к типу int, когда ожидается, что она будет int, или использовать prepared statements

1 голос
/ 11 ноября 2011

Если предположить, что id - это числовой столбец, MySQL автоматически преобразует ваш параметр в число, чтобы типы данных совпадали перед сравнением.Это работает безупречно, если кастинг не дает неожиданных результатов.Например, эти выражения с совпадают со строкой с id = 10, потому что все строки приводятся к 10 :

id='10'
id='   10'
id='00010'
id='10foo'

Следующие строки не будут соответствовать строке, так как строки, которые невозможно проанализировать, приводятся к 0 и 10 <> 0:

id='foo10'
id='bar'

Когда использовать каждый?Если вам нужна строка, вам нужно заключить ее в кавычки (другого способа набрать строку и получить действительный SQL нет).Если вам нужно число, оно должно быть заключено в кавычки (в противном случае вы получите строку, которая содержит число).Конечно, вы всегда можете предоставить числа в виде строк и позволить MySQL выполнить преобразование, но это на самом деле ничего не добавляет к запросу, кроме одного дополнительного шага и, возможно, неверных результатов, которые остаются незамеченными.

1 голос
/ 11 ноября 2011

Если значение является строкой, вы должны использовать ' или ".

Если значение представляет собой число, как в вашем примере, вам не нужно использовать ', но MySQL обрабатывает его, если вы зададите значение ' с.

0 голосов
/ 11 ноября 2011

Вы всегда должны их использовать.Они могут помочь остановить SQL-инъекцию атак, потому что mysql_real_escape_string само по себе недостаточно.

При условии, что вы выполняете запрос через PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...