Когда использовать одинарные, двойные кавычки и обратные кавычки в MySQL/PHP?
Полное руководство по кавычкам в MySQL + PHP
Разберём три типа кавычек и их строгое назначение. Запомните главное правило: кавычки в SQL и кавычки в PHP — это разные вещи, хотя внешне они выглядят одинаково.
1. Одинарные кавычки (') — для строковых значений
В SQL одинарные кавычки используются только для строковых литералов (текста, дат, чисел в строковом формате).
-- Правильно: строка в SQL
SELECT * FROM users WHERE name = 'Иван';
-- Ошибка: двойные кавычки для строк в стандартном SQL
SELECT * FROM users WHERE name = "Иван";
В PHP: когда вы пишете SQL-запрос внутри PHP-строки, следите за вложенностью. Если PHP-строка в двойных кавычках — используйте одинарные для SQL-строк:
$name = "Иван";
// PHP-строка в двойных кавычках, SQL-строка в одинарных
$query = "SELECT * FROM users WHERE name = '$name'";
Если PHP-строка в одинарных — переменные не подставляются, и вам придётся конкатенировать:
$query = 'SELECT * FROM users WHERE name = "' . $name . '"'; // Работает, но некрасиво
2. Двойные кавычки (") — в MySQL для идентификаторов (режим ANSI_QUOTES)
По умолчанию в MySQL двойные кавычки работают как одинарные (для строк), но только если включён режим ANSI_QUOTES. Без этого режима использование двойных кавычек для строк может привести к ошибкам или непредсказуемому поведению. Лучше вообще не использовать двойные кавычки в SQL-запросах — это источник путаницы.
3. Обратные кавычки (`) — для имён таблиц и столбцов
Обратные кавычки в MySQL экранируют идентификаторы (имена таблиц, столбцов, баз данных). Они нужны в трёх случаях:
- Зарезервированные слова:
SELECT * FROM `order`(иначе ORDER будет воспринят как команда SQL) - Спецсимволы в имени:
SELECT * FROM `user-data`(дефис воспринимается как минус) - Имена с пробелами:
SELECT `first name` FROM users(плохая практика, но бывает)
// Без обратных кавычек — ошибка
$query = "SELECT * FROM order WHERE id = 1"; // Ошибка! ORDER — ключевое слово
// С обратными кавычками — работает
$query = "SELECT * FROM `order` WHERE id = 1";
// Для столбцов тоже
$query = "SELECT `name`, `email` FROM `users` WHERE `id` = 10";
4. Как экранировать кавычки в PHP-строке
Если внутри PHP-строки в двойных кавычках нужно использовать двойные кавычки для SQL — экранируйте их обратным слешем:
// Экранирование двойных кавычек внутри двойных
$query = "SELECT * FROM \"users\" WHERE \"name\" = 'Иван'"; // Работает, но не нужно
Но зачем? Просто используйте обратные кавычки для идентификаторов и одинарные для строк — и никакой путаницы.
5. Практические примеры (хороший и плохой код)
// ❌ ПЛОХО: смешение кавычек, риск SQL-инъекций
$name = $_GET['name'];
$query = "SELECT * FROM users WHERE name = '$name'"; // Уязвимо!
// ✅ ХОРОШО: подготовленные запросы (PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $name]);
// ✅ ХОРОШО: если без подготовки, то экранирование + правильные кавычки
$name = mysqli_real_escape_string($conn, $name);
$query = "SELECT * FROM `users` WHERE `name` = '$name'";
Итоговая таблица
'(одинарные) — для строковых значений в SQL"(двойные) — в SQL лучше не использовать, только если режим ANSI_QUOTES`(обратные) — для имён таблиц, столбцов, БД (особенно с зарезервированными словами)- В PHP — двойные кавычки подставляют переменные, одинарные — нет. Выбирайте внешние кавычки PHP так, чтобы внутренние кавычки SQL не конфликтовали.
Запомните: одинарные — для данных, обратные — для схемы, двойные — не используйте в SQL. И всегда используйте подготовленные запросы для безопасности!
<<Альтернативный взгляд: меньше кавычек — меньше проблем
Хотя первый ответ технически верен, я предлагаю подход, который используют многие опытные разработчики: максимально избегать ручного написания SQL с кавычками.
Используйте ORM или Query Builder
Современные фреймворки (Laravel, Symfony) предоставляют Query Builder, который сам расставляет кавычки:
// Laravel Eloquent — никаких кавычек вручную
$users = DB::table('users')
->where('name', 'Иван')
->get();
// Или с зарезервированным именем таблицы
$orders = DB::table('orders')->where('id', 1)->get(); // 'orders' — не 'order'
PDO и именованные плейсхолдеры
Даже без фреймворка используйте PDO — он решает проблему кавычек автоматически:
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute(['Иван']); // PDO сам добавит кавычки и экранирует
Почему это лучше?
- Безопасность: SQL-инъекции невозможны
- Читаемость: нет путаницы с кавычками
- Переносимость: если перейдёте на PostgreSQL, кавычки для идентификаторов там другие (двойные)
Запомните простое правило: если вы пишете '$variable' или "$variable" в SQL-запросе — вы делаете что-то не так. Переходите на подготовленные запросы, и вопрос кавычек отпадёт сам собой.