Ошибка: у вас есть ошибка в синтаксисе SQL; проверьте версию сервера MariaDB для правильного синтаксиса для использования рядом с '' student '' в строке 1 [duplicate]

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

Пример:

$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';

Кроме того, в приведенном выше примере рассмотрим, что "table," "col[n]," and "val[n]" могут быть переменными.

Каков стандарт для этого? Что вы делаете?

Я читал ответы на подобные вопросы около 20 минут, но, похоже, нет окончательного ответа на этот вопрос.

497
задан 23 January 2018 в 12:46

7 ответов

Здесь было много полезных ответов, в основном достигающих двух точек.

BACKTICKS() `используются вокруг имен идентификаторов. QUOTES(') используются вокруг значений.

И как @MichaelBerkowski сказал

Backticks должны использоваться для идентификаторов таблиц и столбцов, но необходимы только тогда, когда идентификатор является зарезервированным ключевым словом 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)

Это полностью, потому что 1234156e6 также является экспоненциальным числом.

8
ответ дан 15 August 2018 в 16:39

Помимо всех (хорошо объясненных) ответов, не было упомянутых ниже, и я часто посещаю этот Q & amp; A.

В двух словах; MySQL думает, что вы хотите сделать математику в своей таблице / столбце и интерпретируете дефисы, такие как «электронная почта», как e минус mail.

MySQL думает, что вы хотите сделать математику . Поэтому я думал, что добавлю это как ответ типа «FYI» для тех, кто совершенно не знаком с работа с базами данных и которые могут не понимать технические термины, описанные уже.

2
ответ дан 15 August 2018 в 16:39

В основном в Mysql, эти типы идентификаторов используются в запросах `, ", ' и ().

" или ' используют для включения строка как значения "26-01-2014 00:00:00" или '26-01-2014 00:00:00'. Этот идентификатор используется только для функции неагрегации строки, например now() or sum ,max и т. Д. [F10] использовать для включения таблицы таблицы или таблицы, например. выберите column_name из table_name, где id = '2' () используются только для того, чтобы просто заключить части запроса, например. выберите column_name из table_name где (id = '2' и gender = 'male') или name = 'rakesh.
12
ответ дан 15 August 2018 в 16:39

Одиночные кавычки следует использовать для строковых значений, например, в списке VALUES ().

Backticks обычно используются для указания идентификатора и также могут быть безопасными из-за случайного использования зарезервированных ключевых слов.

В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время записи запросов.

29
ответ дан 15 August 2018 в 16:39

Существует два типа кавычек в MySQL:

' для включения строковых литералов ` для включения идентификаторов, таких как имена таблиц и столбцов

И тогда есть ", что является частным случаем. Он может использоваться для одной из вышеупомянутых целей за раз в зависимости от сервера MySQL sql_mode:

' для включения строковых литералов В режиме ANSI_QUOTES кнопка " может использоваться для обозначения идентификаторов, как `

Следующий запрос приведет к различным результатам (или ошибкам) ​​в зависимости от режима SQL:

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES отключен [ ! d13]

Запрос будет выбирать строковый литерал "column", где столбец foo равен строке "bar"

ANSI_QUOTES включен

Запрос выберет столбец column, где столбец foo равен столбцу bar

Когда использовать

, я предлагаю вам избегать использования ", чтобы ваш код не зависел от SQL режимы Всегда указывайте идентификаторы, так как это хорошая практика (довольно много вопросов на SO обсуждают это)
97
ответ дан 15 August 2018 в 16:39

В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время написания запросов.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

Теперь предположим, что вы используете прямую переменную post в MySQL-запросе, тогда используйте ее следующим образом:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

Это лучшая практика для использования переменных PHP в MySQL.

10
ответ дан 15 August 2018 в 16:39
  • 1
    Поэтому двойные кавычки являются гибкими, но не могут использоваться в качестве идентификаторов. – rhavendc 31 May 2016 в 11:39
  • 2
    Никогда не используйте прямое использование пользовательского ввода в запросе! – jankal 27 December 2016 в 13:13
  • 3
    @jankal Это просто пример. Я указал, что если вы используете прямой пользовательский ввод, тогда n тогда ........... – vipul sorathiya 28 December 2016 в 12:01
  • 4
    @vipulsorathiya Пожалуйста, укажите в своем ответе, что переменные POST должны быть экранированы. Теперь вы указываете на их использование в своем запросе. Плохо для начинающих, которые пробуют это ... – RFLdev 16 August 2017 в 15:18

Строковые литералы в 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 для. (Хотя подготовленный оператор лучше.)

29
ответ дан 15 August 2018 в 16:39

Другие вопросы по тегам:

Похожие вопросы: