Когда использовать одинарные кавычки, двойные кавычки и обратные кавычки в MySQL
Я пытаюсь разобраться в том, как правильно писать SQL-запросы. Я понимаю, что важно придерживаться единого стиля. До сих пор я использовал одинарные кавычки, двойные кавычки и обратные кавычки совершенно случайным образом, не задумываясь о выборе.
Пример:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Также в приведенном примере следует учитывать, что table
, col1
, val1
и т.д. могут быть переменными.
Каков стандарт для этого? Как поступаете вы?
5 ответ(ов)
Возможно, важно упомянуть, что PHP обрабатывает строки с одинарными и двойными кавычками по-разному...
Строки с одинарными кавычками считаются 'литералами' и в основном отображают то, что вы написали, то есть они WYSIWYG. Строки с двойными кавычками интерпретируются PHP для возможной подстановки переменных (косые кавычки в PHP не являются строками; они выполняют команду в оболочке и возвращают результат).
Примеры:
$foo = "bar";
echo 'there is a $foo'; // there is a $foo
echo "there is a $foo"; // there is a bar
echo `ls -l`; // ... список директорий
В MySQL для разделения частей запроса используются следующие символы: ```, "
, "
и ()
.
"
или'
используются для заключения строковых значений, например,"26-01-2014 00:00:00"
или'26-01-2014 00:00:00'
. Эти символы предназначены исключительно для строк, а не для агрегатных функций, таких какnow
,sum
илиmax
.``` используется для заключения имен таблиц или столбцов, например:
select
column_namefrom
table_namewhere id='2'
.(
и)
просто служат для группировки частей запроса, например:select
column_namefrom
table_namewhere (id='2' and gender='male') or name='rakesh'
.
На этом ресурсе было много полезных ответов, которые в целом сводятся к двум основным пунктам:
- Обратные кавычки (`) используются для имен идентификаторов.
- Одинарные кавычки (') используются для значений.
Как отметил @MichaelBerkowski:
Обратные кавычки следует использовать для имен таблиц и столбцов, но они необходимы только в случае, если идентификатор является зарезервированным словом MySQL, или если идентификатор содержит пробелы или символы за пределами ограниченного набора (см. ниже). Часто рекомендуется избегать использования зарезервированных слов в качестве идентификаторов столбцов или таблиц, когда это возможно, чтобы избежать проблем с кавычками.
Тем не менее, существует случай, когда идентификатор не является зарезервированным словом, не содержит пробелов и символов за пределами ограниченного набора, но при этом требует использование обратных кавычек.
ПРИМЕР
123E10
является допустимым именем идентификатора, но также является допустимым литералом INTEGER
.
[Не углубляясь в детали, как можно получить такое имя идентификатора], предположим, я хочу создать временную таблицу с именем 123456e6
.
Нет ОШИБКИ с обратными кавычками.
DB [XXX]> create temporary table `123456e6` (`id` char(8));
Query OK, 0 rows affected (0.03 sec)
Есть ОШИБКА, если не использовать обратные кавычки.
DB [XXX]> create temporary table 123451e6 (`id` char(8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1
Однако 123451a6
является совершенно допустимым именем идентификатора (без обратных кавычек).
DB [XXX]> create temporary table 123451a6 (`id` char(8));
Query OK, 0 rows affected (0.03 sec)
Это совершенно связано с тем, что 123456e6
также является экспоненциальным числом.
Строковые литералы в MySQL и PHP одинаковы.
Строка — это последовательность байтов или символов, заключённых в одинарные («'») или двойные («"») кавычки.
Если ваша строка содержит одинарные кавычки, вы можете использовать двойные кавычки для обозначения строки. И наоборот, если строка содержит двойные кавычки, используйте одинарные кавычки. Однако если ваша строка содержит как одинарные, так и двойные кавычки, вам нужно экранировать ту кавычку, которая используется для её обозначения.
В основном, для строковых значений SQL мы используем одинарные кавычки, поэтому для строк в PHP обычно используют двойные кавычки.
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";
Также вы можете использовать переменные в строках с двойными кавычками в PHP:
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";
Но если значения $val1
или $val2
содержат одинарные кавычки, это сделает ваш SQL-запрос неправильным. Поэтому вам необходимо экранировать эти кавычки перед использованием в SQL; для этого и предназначена функция mysql_real_escape_string
. (Хотя подготовленные выражения являются лучшим подходом.)
Использование PHP и MySQL вместе упрощает написание запросов благодаря возможности применения одинарных и двойных кавычек.
Например, вы можете написать запрос так:
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
Теперь, если вы хотите использовать переменные, полученные из POST-запроса, ваш код будет выглядеть следующим образом:
$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES ('".$_POST['id']."', '".$_POST['name']."', '".$_POST['email']."')";
Однако, важно отметить, что данный подход может привести к уязвимостям, связанным с SQL-инъекциями. Рекомендуется всегда использовать подготовленные выражения или экранировать входные данные, чтобы обеспечить безопасность вашего приложения.
Как сбросить AUTO_INCREMENT в MySQL
INNER JOIN ON vs WHERE: что выбрать?
Присоединение против подзапроса: что выбрать?
Вставка записи в таблицу MySQL или обновление, если запись существует
Как выбрать строки с MAX(значение колонки), используя PARTITION по другой колонке в MySQL?