?
не имеет особого значения в MySQL WHERE =
операторы
Это имеет особое значение только для нескольких внешних интерфейсов, таких как PHP stdlib, и веб-фреймворков, таких как Rails.
?
- это просто синтаксическая ошибка в:
CREATE TABLE t (s CHAR(1));
SELECT * FROM t WHERE s = ?;
потому что это не в кавычках, а в:
INSERT INTO t VALUES ('a');
INSERT INTO t VALUES ("?");
SELECT * FROM t WHERE s = '?';
возвращает:
s
?
таким образом, по-видимому, без особого значения.
Пример рельса
Например, в Rails знак вопроса заменяется аргументом, заданным переменной языка программирования библиотеки (Ruby), например ::1010 *
Table.where("column = ?", "value")
и он автоматически заключает в кавычки аргументы, чтобы избежать ошибок и внедрения SQL, генерируя выражение вроде:
SELECT * FROM Table WHERE column = 'value';
Цитирование спасет нас в случае чего-то вроде:
Table.where("column = ?", "; INJECTION")
MySQL 5.0 подготовленные операторы
В MySQL 5.0 добавлена функция подготовленного оператора , которая имеет семантику, сходную с вопросительным знаком в веб-фреймворках.
Пример из документации:
PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
SET @a = 3;
SET @b = 4;
EXECUTE stmt1 USING @a, @b;
Выход:
hypotenuse
5
Они также экранируют специальные символы, как и ожидалось:
PREPARE stmt1 FROM 'SELECT ? AS s';
SET @a = "'";
EXECUTE stmt1 USING @a;
Выход:
s
'